Вывести последнее вставленное значение первичного ключа из хранимой процедуры

У меня есть некоторые трудности с этим в том, что я не уверен, как это сделать в 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

Другие вопросы по тегам