2011-01-13 2 views
2

삽입 유형 대신 INTOEAD OF 트리거 유형이 있습니다. 그것은 뭔가 다음과 같습니다"영향을받은 행"메시지를 트리거 및 비활성화합니다.

IF EXISTS(some select staement) 
updade 
set 
where 
ELSE IF (some other select staement) 
    insert 
    values 
ELSE--(3) 
RAISERROR ('msg',16,1) 
RETURN; SET NOCOUNT ON; 

문제는 3 년이다 - "다른"옵션 내가 어떤 "행 적용됨"메시지없이 단지 에러 메시지를 표시하고 싶습니다. 나를 위해 일할 때 NOFOUNT를 설정하십시오. 나는 이미 다른 구성을 시도해 왔으며, 이것을 반환하거나하지 않고 이것을 넣었다. 나는 진술서에 사방에 퍼트렸다. 어디서나 작동하지 않습니다. SQL Server 2005 사용 누군가 제발 나를 도와 줄 수 있습니까? 영향을받은 행은 항상 표시되어야합니다. 유일한 예외는 else 문입니다.

+2

무엇이 작동하지 않습니까? 오류 메시지 란 무엇입니까? –

답변

6

쿼리 전에 사용 SET NOCOUNT ON;하고 단순화 된 예에서 GO

SET NOCOUNT ON; 
GO 
+0

죄송합니다, 작동하지 않습니다 : ( – truthseeker

+0

아직 1 행 (들)에 영향을받는 메시지가 계속 표시된다는 의미입니다 . – truthseeker

+0

왜 그런가요? –

3

를 사용 :

Msg 50000, Level 16, State 1, Procedure TT, Line 5 
No 

(1 row(s) affected) 

유일한 방법에 :

create table T (
    ID int not null 
) 
go 
create trigger TT 
on T 
instead of insert 
as 
    RAISERROR('No',16,1) 
go 
insert into T (ID) 
select 1 

우리는 출력을 얻을 "1 행 영향을받은"메시지를 표시하지 않음 sage는 트랜잭션을 롤백하는 것입니다 (오류 메시지 다음에 ROLLBACK을 포함 시킴). 그러면 대신 다음과 같이 생성됩니다.

Msg 50000, Level 16, State 1, Procedure TT, Line 5 
No 
Msg 3609, Level 16, State 1, Line 1 
The transaction ended in the trigger. The batch has been aborted. 

이러한 메시지를 더 이상 표시하지 않을 방법이 없습니다. 트리거의 범위 내에서가 아니라 외부 범위 (INSERT 문이 실행되는 범위)에서 "1 행 영향을 받았습니다."메시지가 생성되고 트리거가 완료까지 실행 중이기 때문에 생성 중입니다. 외부 진술은 걱정 스럽지만, 성공했습니다.

NOCOUNT에 대한 일반적인 조언은 트리거 내에서 반환되는 추가 행 개수를 억제하는 데 사용하는 것입니다. 이를 위해 사용하는 경우 트리거 본문의 첫 번째 문이어야합니다. 샘플에서는 마지막 문장으로 사용합니다. 어쨌든 아무 효과가 없습니다.

관련 문제