2014-12-10 3 views
1

Это я моя процедура, которая определяет Classid и liveareaId для животных, чтобы вставить его в таблицуSQL Присвоить значение локальной переменной взять из таблицы

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 

У меня есть ошибка:

Cannot insert the value NULL into column 'ClassId', table 'ZOO.dbo.Animal'; column does not allow nulls. INSERT fails.

Почему ClassId null, можете ли вы сказать мне, почему это не работает.

SET @classid = 

(SELECT Id 
FROM dbo.Class 
WHERE [email protected]) 
+0

Существуют данные в таблице классов, и имя_класс поставляются в правых – needermen

+0

[Плохие привычки пинают : объявление VARCHAR без (длина)] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx) - вы должны ** всегда ** предоставляют длину для любых переменных (и) varchar' и параметров, которые вы используете. В противном случае ваши параметры, такие как '@ name',' @ classname' и т. Д., Получат ** ровно 1 символ длиной ** - обычно * не *, что вы хотите! –

ответ

1

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

провозглашает:

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

Большое вам спасибо – needermen

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 [email protected] 
AND dbo.Class.Id IS NOT NULL) 

SET @liveareaid = 
(SELECT Id 
FROM dbo.LiveArea 
WHERE [email protected]) 

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

Id является первичным ключом, не может быть пустым – needermen

+0

Поэтому 'НЕ NULL' – Matt

0

Вы можете сказать нам, какие parameteres проходят мимо вас во время вызова процедуры на странице/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 
+0

EXEC insertAnimal @ имя = N'tiger» \t \t \t, @ = год рождения 1999 \t \t \t, @ имя_класса = N'class1' \t \t \t, @ livearea = N'area1 '; ЕСТЬ класс 1 в dbo.Class AND area1 in dbo.LiveArea – needermen

+0

вызов кажется Ok. Я полагаю, может быть проблема с данными в таблицах! можете ли вы предоставить структуру таблицы вместе с образцами данных? – Mudassir

+0

Отредактировал свой ответ. Итак, пожалуйста, проверьте и дайте мне знать результат – Mudassir