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