SQL присвоить значение локальной переменной взять из таблицы

Это моя процедура, которая определяет classId и liveareaId для Animal, чтобы вставить его в таблицу

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 Нуль, можете ли вы сказать мне, почему не работает.

SET @classid =  

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

3 ответа

Решение

Это потому что вы объявили @classname как только nvarchar и не указали длину. Когда длина не указана в nvarchar оператор объявления переменной, длина по умолчанию равна 1.

Объявить как:

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

Можете ли вы сказать нам, какие параметры передаются вами при вызове процедуры на вашей странице /Query, а также образцы данных в вашей базе данных?

Похоже, что данные не существуют в вашей базе данных в соответствии с вашими параметрами на странице.

Убедитесь, что данные @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
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
Другие вопросы по тегам