SQL从表中为本地变量赋值

时间:2014-12-10 11:35:07

标签: sql select declare

这是我的程序,它确定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',table' ZOO.dbo.Animal&#39 ;;列不允许空值。 INSERT失败。

为什么ClassId为空,你能否告诉我为什么威尔不行。

SET @classid =  

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

3 个答案:

答案 0 :(得分:1)

这是因为您已将@classname声明为nvarchar并且未指定长度。如果未在nvarchar变量声明语句中指定length,则默认长度为1.

声明为:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

首先在SQL server中尝试以下查询。它是否通过相同的参数提供任何输出?

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