Как SCOPE_IDENTITY может возвратить пустой указатель, когда @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ не делают?

После выполнения вставки, я любой выбор SCOPE_IDENTITY или @@IDENTITY.

SCOPE_IDENTITY пустой указатель возвратов, но @@IDENTITY не делает.

Я не понимаю, как это возможно.

Можно ли думать о причине, почему это происходит?

19
задан marc_s 25 May 2012 в 15:33
поделиться

3 ответа

KM попал в точку:

  • @@ IDENTITY дает вам последнее вставленное значение IDENTITY - независимо от того, в какую таблицу оно было вставлено (подумайте, триггеры , например, в таблицы аудита! Или даже каскад триггеров .....)

  • SCOPE_IDENTITY () дает вам последний IDENTITY, вставленный в область действия вашего оператора, например в таблицах, на которые ссылается ваш собственный, фактический оператор (не те, которые могли быть затронуты триггером)

15
ответ дан 30 November 2019 в 03:12
поделиться

Я нашел это на MSDN:

Функция SCOPE_IDENTITY() вернет нулевое значение, если функция будет вызвана до того, как в области видимости появятся какие-либо операторы INSERT в столбце identity.

Вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/ms190315.aspx

Ваш SQL код был бы очень полезен.

3
ответ дан 30 November 2019 в 03:12
поделиться

вот один пример того, как 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
18
ответ дан 30 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: