Как получить значение 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