2013-05-10 2 views
4

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

Msg 102, Level 15, State 1, Procedure Users_Insert, Line 18
Incorrect syntax near '@userid'.

Fra nkly, я не уверен, что правильно сформулировал выходной параметр, может ли кто-нибудь предложить предложения?

+0

Выберите ВЫБРАТЬ @ = идентификатор SCOPE_IDENTITY(); и удалить его не нужно. –

+2

marc_s не любит мой ленивый ввод: P – Ortund

ответ

10

Необходимо, чтобы присвоило значение @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 

See this blog post for an explanation as to WHY you should use SCOPE_IDENTITY over @@IDENTITY

+0

Что случилось с моим назначением, как я это делал? – Ortund

+1

@Ortund: у вас было ** без ассистента ** - у вас просто было '@userid = ...' - не 'SET' или' SELECT' ключевое слово –

+0

'Обязательно объявлять скалярный varialbe" @userid "' ... when Я попадаю на сервер sql, это все проблемы, проблемы, проблемы ... вот почему я перешел в mysql> _> – Ortund

Смежные вопросы