Почему SCOPE_IDENTITY возвращает NULL? - PullRequest
4 голосов
/ 04 сентября 2011

У меня есть хранимая процедура, которая принимает @dbName и вставляет запись в эту БД. Я хочу получить идентификатор последней вставленной записи. SCOPE_IDENTITY() возвращает NULL и @@IDENTITY возвращает правильный идентификатор, почему это происходит? Пока я читаю, лучше использовать SCOPE_IDENTITY() на случай, если на столе есть триггеры. Могу ли я использовать IDENT_CURRENT? Возвращает ли он идентификатор в области видимости таблицы, независимо от триггера?

Так в чем проблема и что использовать?

EDITED

DECALRE @dbName nvarchar(50) = 'Site'
DECLARE @newId int
DECLARE @sql nvarchar(max)
SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0)'     
EXEC sp_executesql @sql

SET @newId = SCOPE_IDENTITY()

1 Ответ

12 голосов
/ 04 сентября 2011

Как говорит Одед, проблема в том, что вы запрашиваете личность, прежде чем выполнить insert.

В качестве решения лучше запустить scope_identity как можно ближе к insert. Используя sp_executesql с выходным параметром, вы можете запустить scope_identity как часть инструкции динамического SQL:

SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0) ' +
           N'SET @newId = SCOPE_IDENTITY()'
EXEC sp_executesql @sql, N'@newId int output', @newId output

Вот пример в SE Data , показывающий, что scope_identity должен быть внутри sp_executesql.

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