2012-05-29 61 views
1

我有一種情況需要將多個記錄/批量插入插入到具有觸發器的視圖中。我如何檢索插入的身份值?我嘗試使用OUTPUT子句從Inserted表中檢索Id,但它總是返回null。tsql在將多個記錄插入視圖時返回標識值

+1

您可以使用內部的'OUTPUT'條款'INSTEAD OF'觸發自己。或許使用條件邏輯檢查'CONTEXT_INFO'來知道是否使用或不使用子句來調用插入語句。# –

回答

1

使用此設置。

create table InsteadOf 
(
    ID int identity primary key, 
    Name varchar(10) not null 
) 

go 

create view v_InsteadOf 
as 
select ID, Name 
from InsteadOf 

go 

create trigger tr_InsteadOf on InsteadOf instead of insert 
as 
begin 
    insert into InsteadOf(Name) 
    select Name 
    from inserted 
end 

聲明

insert into v_InsteadOf(Name) 
output inserted.* 
select 'Name1' union all 
select 'Name2' 

會給你一個錯誤。

消息334,級別16,狀態1,4號線的 DML語句不能有任何啓用的觸發器如果語句 有未經INTO子句的OUTPUT子句的目標表「與其使用」。

改爲使用插入INTO子句。

declare @IDs table(ID int, Name varchar(10)) 

insert into v_InsteadOf(Name) 
output inserted.* into @IDs 
select 'Name1' union all 
select 'Name2' 

select * 
from @IDs 

給你0作爲值不null

ID   Name 
----------- ---------- 
0   Name1 
0   Name2 

您可以將輸出子句放在觸發器中。

create trigger tr_InsteadOf on InsteadOf instead of insert 
as 
begin 
    insert into InsteadOf(Name) 
    output inserted.* 
    select Name 
    from inserted 
end 

並且當您執行插入操作時會爲您生成輸出。

insert into v_InsteadOf(Name) 
select 'Name1' union all 
select 'Name2' 

結果:

ID   Name 
----------- ---------- 
1   Name1 
2   Name2 

更新:
爲了抓住插入語句的輸出,你可以使用insert into ... exec (...)

declare @T table 
(
    ID int, 
    Name varchar(10) 
) 

insert into @T 
exec 
    (
    'insert into v_InsteadOf(Name) 
    values (''Name1''),(''Name2'')' 
) 
+0

如何將這些返回的值存儲到表變量以供以後使用?下面的查詢返回0作爲插入行的id。 DECLARE @T TABLE(ID INT,NAME VARCHAR(10)) INSERT INTO v_InsteadOf(名稱) OUTPUT插入。* INTO @T VALUES( 'GK'),( 'GV') SELECT * FROM @ T – vgk

+0

@vgk - 更新了我的答案。 –