После выполнения вставки, я любой выбор SCOPE_IDENTITY
или @@IDENTITY
.
SCOPE_IDENTITY
пустой указатель возвратов, но @@IDENTITY
не делает.
Я не понимаю, как это возможно.
Можно ли думать о причине, почему это происходит?
KM попал в точку:
@@ IDENTITY
дает вам последнее вставленное значение IDENTITY - независимо от того, в какую таблицу оно было вставлено (подумайте, триггеры , например, в таблицы аудита! Или даже каскад триггеров .....)
SCOPE_IDENTITY ()
дает вам последний IDENTITY, вставленный в область действия вашего оператора, например в таблицах, на которые ссылается ваш собственный, фактический оператор (не те, которые могли быть затронуты триггером)
Я нашел это на MSDN:
Функция SCOPE_IDENTITY() вернет нулевое значение, если функция будет вызвана до того, как в области видимости появятся какие-либо операторы INSERT в столбце identity.
Вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/ms190315.aspx
Ваш SQL код был бы очень полезен.
вот один пример того, как SCOPE_IDENTITY () будет иметь значение null, но @@ IDENTITY будет иметь значение:
вставить в таблицу без идентификатора, в этой таблице есть триггер вставки, который {{1 }} затем вставляет в таблицу истории с идентификатором . SCOPE_IDENTITY () будет нулевым (нет идентификатора в локальной области), но @@ IDENTITY сообщит об идентификаторе из триггера.
К вашему сведению, есть известная ошибка с SCOPE_IDENTITY (): https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
Лучше всего с удостоверениями использовать OUTPUT INTO, он может захватывать набор идентификаторов и не подвержен ошибке SCOPE_IDENTITY ():
declare @x table (tableID int identity not null primary key, datavalue varchar(10))
declare @y table (tableID int, datavalue varchar(10))
INSERT INTO @x values ('aaaa')
INSERT INTO @x values ('bbbb')
INSERT INTO @x values ('cccc')
INSERT INTO @x values ('dddd')
INSERT INTO @x values ('eeee')
INSERT INTO @x
(datavalue)
OUTPUT INSERTED.tableID, INSERTED.datavalue --<<<<OUTPUT INTO SYNTAX
INTO @y --<<<<OUTPUT INTO SYNTAX
SELECT
'value='+CONVERT(varchar(5),dt.NewValue)
FROM (SELECT id as NewValue from sysobjects where id<20) dt
ORDER BY dt.NewValue
select * from @x
select * from @y