Использование @@ IDENTITY или SCOPE_IDENTITY () + Insert вместе в хранимых процедурах - PullRequest
0 голосов
/ 30 августа 2011

Код такой:

   INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)

   GetLastInsertID @tablename='TABLE'

GetLastInsertID - это хранимая процедура:

   SELECT @@IDENTITY AS LastID FROM TABLE

Как получить хранимую процедуру для возврата LastID в соответствии с запросом в SelectОператор @@ IDENTITY выше?

Я получаю следующую ошибку:

   Incorrect syntax near 'GetLastInsertId'.

... но это прекрасно работает, когда выполняется само по себе:

   GetLastInsertID @tablename='TABLE'

Хорошо,спасибо, я обновил его до Scope_Identity ().Но вы говорите, чтобы не помещать его в другой SP, чтобы поместить его в тот же SP, что и для вставки?

Опять же, я все еще получаю ошибку, когда я объединяю вставку с этим:

   SELECT SCOPE_IDENTITY() AS LastID FROM TABLE

Вот новое сообщение об ошибке:

   There is already an object named 'TABLE' in the database.

Ответы [ 4 ]

5 голосов
/ 30 августа 2011

Это плохая идея вообще разделять это на хранимую процедуру, потому что хранимая процедура создает новую область видимости / контекст. Это оставляет вас открытым для получения неправильного идентификационного номера. Если один пользователь в сеансе вставляет много строк вместе, вы можете получить неправильный результат.

Вместо этого вам почти всегда требуется функция scope_identity (), и вы хотите вызывать ее в том же контексте, что и оператор, создавший новую запись.

2 голосов
/ 30 августа 2011

Во-первых, вы никогда не захотите использовать @@ identity, поскольку оно может сломаться, если кто-то добавит триггер.

То, что вы хотите использовать, это предложение OUTPUT или scope_identity.См. Книги в Интернете, чтобы ознакомиться с примерами использования OUTPUT.

0 голосов
/ 30 августа 2011

ваша ошибка в том, что вы не включили команду EXECUTE, попробуйте это:

INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)

EXEC GetLastInsertID @tablename='TABLE'

EXEC предполагается, когда вы пытаетесь запустить процедуру без других команд, однако, когда вывключите INSERT, что делает EXEC необходимым.

Теперь вам действительно нужно определить, является ли то, что вы пытаетесь сделать, хорошим дизайном.

попробуйте это:

DECLARE @LastId int
INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)
SELECT @LastID=SCOPE_IDENTITY()
0 голосов
/ 30 августа 2011

Вот мой пример кода, который делает это.(Но сохраненный процесс не добавляет никакого значения.)

--First create a test table.
    create table test
    (id int identity,
    name varchar(30))
    go

--A stored proc that returns the scope_identity()  
    create proc dbo.spTest
    as

    insert into test(name)
    values ('test')

    return scope_identity()

    go


-- Sample call
    declare @newId int

    exec @newId = spTest

    print @newId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...