2017-12-27 31 views
0

SQL Server 2012를 사용하고 있습니다. 사용자가 DML 작업을 수행 할 수 있도록하기 위해 뷰에 트리거가 있습니다. 다른 테이블. 이러한 트리거에는 SET NOCOUNT ON이 있고 논리적 오류를 catch하기 위해 많은 수의 IF...RAISERROR(...) RETURN 문이 있습니다. 트리거가 기본 테이블에 영향을주지 않고 반환 되더라도 SSMS는 "n 개 이상의 영향을받는 행"을 출력합니다. 여기서 n은 뷰에서 영향을받는 행 수입니다. 그래서, 나도 같은 결과, 다음과 같은 간단한 트리거를 테스트 :NOCOUNT 출력이있는 트리거 데이터 테이블 행이 변경되지 않은 경우 하나 이상의 행이 영향을받습니다.

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest 
INSTEAD OF INSERT AS 
BEGIN 
    SET NOCOUNT ON 
    IF 1 != 0 
    BEGIN 
     RAISERROR('No rows should be affected!', 16, 1) 
     RETURN 
    END 
END 

INSERT INTO dbo.viewTest (columnA) VALUES (1) 

그리고 SSMS가 1 row(s) affected를 인쇄합니다.

이 출력을 어떻게 억제합니까?

+0

합니다. –

답변

1

다음은이 메시지가 콘솔로 반환되지 않도록합니다. 그것은 @Eralper 말한 기반으로 여기에 내 자신의 질문에 대답 트리거 코드

set nocount on 
insert into viewTest select... 
set nocount off 
+0

'세션 설정과 관련이 있습니다 ...'가이 동작의 이유이기 때문에 이것을 답변으로 표시하고 있으며, 그 메시지가 '쓰루 (Throw)'오류가되지 않도록하는 유일한 방법이 있습니다. – zambonee

0

하지 세션 설정과 관련이있다; 이 메시지는 트리거가 아닌 세션 설정에 있습니다. 따라서 메시지를 방지 할 수있는 유일한 방법은 THROW에 해당 세션을 취소하는 오류입니다 (RAISERROR()은 세션을 취소하지 않습니다). 다음 트리거는 n row(s) affected를 표시하지 않습니다 다음 * 삽입 *에서 행 개수가 아닌 트리거 취한 조치에 의해 행 수의

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest 
INSTEAD OF INSERT AS 
BEGIN 
    SET NOCOUNT ON 
    IF 1 != 0 
    BEGIN 
     ;THROW 50000, 'No rows should be affected!', 1 
    END 
END 

INSERT INTO dbo.viewTest (columnA) VALUES (1)