#stored-procedures #sql-server-2008-r2 #identity-column
#хранимые процедуры #sql-server-2008-r2 #идентификатор-столбец
Вопрос:
Добрый день,
Я написал очень простую хранимую процедуру, которая будет использоваться для вставки questionText и QuestionStatus в таблицу вопросов с первичным ключом QuestionID int, установленным как имеющий идентификатор.
Синтаксис следующий:
CREATE PROCEDURE InsertNewQuestion
-- Add the parameters for the stored procedure here
@QuestionText varchar(200), @QuestionStatus bit
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
INSERT into Questions
(QuestionText,QuestionStatus)
Values
(@QuestionText),(@QuestionStatus)
END
GO
Когда я выполняю хранимую процедуру, я получаю следующую ошибку:
В инструкции INSERT больше столбцов, чем значений, указанных в предложении VALUES. Количество значений в предложении VALUES должно соответствовать количеству столбцов, указанному в инструкции INSERT.
Какой правильный синтаксис использовать, чтобы правильно вставить запись и разрешить автоматическое увеличение QuestionID при каждой вставке?
Большое спасибо за вашу помощь и указания.
Обновленный синтаксис хранимой процедуры
Комментарии:
1. Ваша строка значений по-прежнему закрывает параграфы вокруг каждого параметра. Предполагается, что все они должны быть в одном параграфе, разделенном запятой. Значения (@questionText, @QuestionStatus)
Ответ №1:
Удалить QuestionID и @@Identity Значения должны быть (@questionText,@QuestionStatus)
INSERT into Questions
(QuestionText,QuestionStatus)
Values
(@QuestionText,@QuestionStatus)
SQL Server знает, что QuestionID является полем идентификации, и увеличит его …. 🙂
Если вам нужно вернуть идентификатор, который был вставлен, тогда создайте параметр out в SP и получите его, вызвав SCOPE_IDENTITY().
УСТАНОВИТЕ @QuestionID = SCOPE_IDENTITY()
Ответ №2:
Вы не указываете столбцы идентификаторов, и значения не должны заключаться в их собственные круглые скобки.
INSERT into Questions
(QuestionText,QuestionStatus)
Values
(@QuestionText, @QuestionStatus)
Ответ №3:
INSERT into Questions (QuestionText,QuestionStatus)
Values (@QuestionText,@QuestionStatus)
т.е. без указанного поля идентификации.
Ответ №4:
CREATE PROCEDURE SPWITHPARAMETER_AND_RETURN_VALUE
(
@EMPID INT,
@IDVAL INT,
@RETURNVALUE INT =0 OUT
)
AS
DECLARE @COUNT INT
BEGIN
SELECT @COUNT=COUNT(*) FROM JOINTABLE WHERE EMPID=@EMPID AND IDVAL=@IDVAL
IF(@COUNT >0)
BEGIN
SET @RETURNVALUE = 1;
PRINT @RETURNVALUE
RETURN @RETURNVALUE
END
ELSE
BEGIN
SET @RETURNVALUE = 1;
PRINT @RETURNVALUE
RETURN @RETURNVALUE
END
END