2012-02-03 9 views
2

이 트리거 :INSTEAD OF 트리거를 SCOPE_IDENTITY와 함께 사용할 수있는 방법이 있습니까?

ALTER TRIGGER InsteadTrigger on CustomerView 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Person 
     SELECT FirstName, LastName 
     FROM inserted 

원인이 쿼리는 null을 반환합니다.

INSERT INTO CustomerView (FirstName, LastName) Values ('Jonathan', 'Allen') 
SELECT SCOPE_IDENTITY() 

트리거를 수정하여 SCOPE_IDENTITY가 올바른 값을 반환하도록 할 수있는 방법이 있습니까? (관련 테이블에 다른 트리거가있을 수 있으므로 @@ IDENTITY를 사용할 수 없습니다.)

+0

P. 고객이 이에 대해 묻고 있습니다. 나는 결코 의도적으로이 상황에 빠지지 않을 것이다. –

+0

먼저, INSERT를 가정하는 가장 일반적인 오류는 한 행만 처리하는 것입니다. 하나의 insert 문으로 여러 행을 삽입 할 수 있습니다. –

+1

아니에요. 트리거는 여러 행에 대해 작동하며 SCOPE_IDENTITY가 삽입 될 때까지 아무도 작동하지 않을 것으로 예상하지 않습니다. –

답변

3

아니요 가능하지 않습니다.

물론 트리거 자체에서 반환 할 수 있습니다.

ALTER TRIGGER InsteadTrigger on CustomerView 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Person 
     SELECT FirstName, LastName 
     FROM inserted 

     SELECT SCOPE_IDENTITY() AS PersonId 
END 

그리고 당신은 당신이 그것을 필요로 할 때를 제외하고 결과 집합을 억제하는 CONTEXT_INFO를 사용할 수 있습니다.

this Microsoft Connect Item에서 설명한대로 OUTPUT 절을 사용하는 것이이 컨텍스트에서는 작동하지 않습니다. 따라서 주 테이블에 삽입되기 전에 그리고 IDENTITY 함수가 호출되기 전에 평가됩니다.

+0

위의 모든 상황은 좋지 않습니다. 이때 나는 이것이 그들이 희망 할 수있는 최선이라고 믿습니다. –

관련 문제