Как получить значение столбца идентичности с помощью OUTPUT - SQL Server - PullRequest
1 голос
/ 20 мая 2011

У меня есть таблица и триггер

create table test(id int not null identity(1,1) primary key, data int);
create trigger insteadTestInsert ON test INSTEAD OF INSERT 
AS
BEGIN
  INSERT INTO test(data) select data FROM inserted;
END;

Когда триггер включен, следующий запрос

declare @tmp_table table(id int, int_val int);
insert into test(data) 
output inserted.* into @tmp_table
values (10);
select * from @tmp_table;

возвращает id = 0, int_val = 10.
Если я отключаю (или сбрасываю) триггер, запрос возвращает правильное значение id.

Как заставить OUTPUT вставить правильные результаты в табличную переменную?

Ответы [ 3 ]

2 голосов
/ 20 мая 2011

С MSDN

Столбцы, возвращаемые из OUTPUT, отражают данные такими, какие они есть после выполнения оператора INSERT, UPDATE или DELETE, но до выполнения триггеров.

Таким образом, проблема в том, что перед выполнением вставленного триггера не был установлен идентификатор.

Даже если удалить содержимое триггера, как это

create trigger insteadTestInsert on test instead of insert 
as
begin
    return;
end

, вы будетевидите, что inserted все еще заполнен, хотя ничего не было inserted в таблице.В основном inserted в output операторе соответствует inserted внутри триггера.

1 голос
/ 20 мая 2011

Это на самом деле работает.

declare @tmp_table table(seq int identity, id int, int_val int);
insert into test(data) 
output inserted.data into @tmp_table(int_val)
values (11),(12),(13);

update @tmp_table set id = seq + @@identity - @@rowcount
select * from @tmp_table;
select top 2 * from test order by id desc;

Ограничение: у вас НЕ должно быть никаких других триггеров в таблице test, которые бы "повредили" переменную @@ identity.

1 голос
/ 20 мая 2011

Это взлом, но он работает:

declare @tmp_table table(id int, int_val int);
insert into test(data) 
output @@IDENTITY + 1, inserted.data into @tmp_table
values (10);
select * from @tmp_table;

Подробнее об использовании @@ IDENTITY см. http://msdn.microsoft.com/en-us/library/ms190315.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...