2012-05-29 4 views
1

트리거 대신보기에 여러 레코드/배치 삽입을 삽입해야하는 경우가 있습니다. 삽입 된 ID 값을 검색하려면 어떻게해야합니까? OUTPUT 절을 사용하여 삽입 된 테이블에서 ID를 검색하려고 시도했지만 항상 null을 반환합니다.보기에 여러 레코드를 삽입 할 때 tsql에서 ID 값을 반환합니다.

+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 호선 문 은 INTO 절없이 OUTPUT 절을 포함하는 경우 모든 활성화 된 트리거를 가질 수없는 DML 문의 대상 테이블 '하는 것은 아니고'.

삽입에 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 

당신에게 값이 아닙니다 null0를 제공합니다.

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

이 반환 값을 나중에 사용할 수 있도록 테이블 변수에 저장할 수 있습니까? 아래 쿼리는 삽입 된 행에 대해 ID로 0을 반환합니다. DECLARE의 @T 표 (ID INT, NAME VARCHAR (10)) @T 값으로 INSERT INTO v_InsteadOf (이름) OUTPUT 삽입했다. * ('GK'), ('GV') SELECT * FROM을 @ T – vgk

+0

@vgk - 내 대답이 업데이트되었습니다. –

관련 문제