Как получить значение Identity с помощью scope_identity()

У меня есть scope_identity(), который реализован в TRIGGER.

ALTER TRIGGER TempProcTrig
ON Table_temp2
AFTER insert
AS
BEGIN

     declare @TempIdentity int
     set @TempIdentity =scope_identity() 
     insert Table_Temp(TempID) 
     values(@TempIdentity)
END

Когда TRIGGER запущен, @TempIdentity получает поле столбца Identity и устанавливает это значение в другую таблицу.

Но всегда после срабатывания TRIGGER @TempIdentity получает значение NULL.

Почему TempIdentity не получает поле Identity? Что я должен изменить в своем коде?

2 ответа

Решение

Причина этой проблемы в том, что, как следует из названия, SCOPE_IDENTITY() возвращает только значение идентификатора из области, в которой вы вызываете его.

Вызов его из триггера вернет значение идентификатора из триггера, который NULL так как вы не вставляете никаких строк.

Как предполагает Джо, используйте inserted таблица, чтобы получить значения, необходимые вместо этой функции.

Первая проблема: вы пишете свой триггер с предположением, что будет вставлена ​​только одна строка. Что происходит, если несколько строк вставляются одним оператором?

Есть специальный inserted таблица доступна в триггерах, которая содержит все строки, вставленные операцией, вызвавшей срабатывание триггера. Вы можете использовать это так:

INSERT INTO Table_Temp
    (TempID)
    SELECT i.YourIdentityColumn
        FROM inserted i
Другие вопросы по тегам