【问题标题】:SQL Assign value to local variable take from tableSQL从表中为局部变量赋值
【发布时间】:2014-12-10 11:35:07
【问题描述】:

这是我的程序,它确定了 Animal 的 classId 和 liveareaId 以将其插入表中

CREATE PROCEDURE insertAnimal
@name nvarchar,
@birthyear int,
@classname nvarchar,
@livearea nvarchar
AS
BEGIN
DECLARE @classid int
DECLARE @liveareaid int

SET @classid =  

(SELECT Id
 FROM dbo.Class 
 WHERE dbo.Class.Name = @classname)

SET @liveareaid =
(SELECT Id
 FROM dbo.LiveArea 
 WHERE Name = @livearea)

INSERT INTO dbo.Animal (Name,BirthYear,ClassId,LiveAreaId) VALUES
(
    @name,
    @birthyear,
    @classid,
    @liveareaid
)
END
GO

我有一个错误:

无法将值 NULL 插入列“ClassId”、表“ZOO.dbo.Animal”;列不允许空值。插入失败。

为什么ClassId 为空,你能告诉我为什么 whis 不起作用。

SET @classid =  

(SELECT Id
 FROM dbo.Class 
 WHERE dbo.Class.Name=@classname)

【问题讨论】:

  • 类表中有数据,提供的类名是对的
  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何(n)varchar 变量和参数提供长度。否则,您的参数(如 @name@classname 等)最终会正好是 1 个字符 - 通常不是您想要的!

标签: sql select declare


【解决方案1】:

这是因为您将@classname 声明为仅nvarchar 并且没有指定长度。当nvarchar变量声明语句中没有指定长度时,默认长度为1。

声明为:

CREATE PROCEDURE insertAnimal
@name nvarchar(10),
@birthyear int,
@classname nvarchar(10),
@livearea nvarchar(10)
...

【讨论】:

    【解决方案2】:
    CREATE PROCEDURE insertAnimal
    @name nvarchar,
    @birthyear int,
    @classname nvarchar,
    @livearea nvarchar
    AS
    BEGIN
    DECLARE @classid int
    DECLARE @liveareaid int
    
    SET @classid =  
    
    (SELECT Id
    FROM dbo.Class 
    WHERE dbo.Class.Name=@classname
    AND dbo.Class.Id IS NOT NULL)
    
    SET @liveareaid =
    (SELECT Id
    FROM dbo.LiveArea 
    WHERE Name=@livearea)
    
    INSERT INTO dbo.Animal (Name,BirthYear,ClassId,LiveAreaId) VALUES
    (
        @name,
        @birthyear,
        @classid,
        @liveareaid
    )
    END
    GO
    

    【讨论】:

    • Id是主键,不能为空
    【解决方案3】:

    您能否告诉我们在您的页面/查询中调用过程以及数据库中的示例数据时您传递了哪些参数?

    根据您在页面中的参数,您的数据库中似乎不存在数据。

    确保您作为参数传递的@classname 和@liveareaid 数据必须分别位于数据库表dbo.Class 和dbo.LiveArea 中。

    首先在 SQL 服务器中尝试以下查询。它是否通过相同的参数给出任何输出?

    SELECT Id FROM dbo.Class  WHERE dbo.Class.Name = @classname
    SELECT Id FROM dbo.LiveArea  WHERE Name = @livearea
    

    【讨论】:

    • EXEC insertAnimal @name=N'tiger' ,@birthyear=1999 ,@classname=N'class1' ,@livearea=N'area1'; dbo.Class 中有一个 class1,dbo.LiveArea 中有一个 area1
    • 调用似乎没问题。我想可能是表格中的数据有问题!你能提供表格的结构和样本数据吗?
    • 编辑了我的答案。所以,请检查并让我知道结果
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多