Как получить значение идентичности с помощью scope_identity () - PullRequest
1 голос
/ 18 января 2012

У меня есть 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 ]

3 голосов
/ 18 января 2012

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

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

INSERT INTO Table_Temp
    (TempID)
    SELECT i.YourIdentityColumn
        FROM inserted i
1 голос
/ 18 января 2012

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

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

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

...