Вывести последнее вставленное значение первичного ключа из хранимой процедуры
У меня есть некоторые трудности с этим в том, что я не уверен, как это сделать в SQL Server.
По сути, я хочу вставить новую строку в базу данных, получить значение PK, которое было только что вставлено (тот же запрос), и вывести его обратно во все, что называется хранимой процедурой:
CREATE PROCEDURE Users_Insert
-- Add the parameters for the stored procedure here
@userid int output,
@name varchar(50),
@surname varchar(50),
@email varchar(200),
@password varchar(50),
@location varchar(50)
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 Users(FirstName, LastName, Email, Password, Location)
values(@name, @surname, @email, @password, @location);
GO
@userid = @@IDENTITY;
END
Я сделал это в MySQL следующим образом:
CREATE PROCEDURE Users_Insert(@userid int output, @name varchar(50), @surname varchar(50), @email varchar(200), @password varchar(50), @location varchar(50)
BEGIN
insert into Users(FirstName, LastName, Email, Password, Location)
values(@name, @surname, @email, @password, @location);
set @userid = last_insert_id();
END
SQL Server выдает мне ошибку:
Сообщение 102, уровень 15, состояние 1, процедура Users_Insert, строка 18
Неверный синтаксис рядом с @userid.
Честно говоря, я не уверен, что правильно объявил выходной параметр, может кто-нибудь предложить предложения?
1 ответ
Вам необходимо присвоить значение @userid
! Также я бы порекомендовал использовать SCOPE_IDENTITY()
и не @@IDENTITY
:
CREATE PROCEDURE Users_Insert
-- Add the parameters for the stored procedure here
@userid int output,
@name varchar(50),
@surname varchar(50),
@email varchar(200),
@password varchar(50),
@location varchar(50)
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 Users(FirstName, LastName, Email, Password, Location)
values(@name, @surname, @email, @password, @location);
-- make an actual **assignment** here...
SELECT @userid = SCOPE_IDENTITY();
END
См. Этот пост в блоге для объяснения, почему вы должны использовать SCOPE_IDENTITY
над @@IDENTITY