0

즉, 내가 proc를 호출하는 트리거를 가지고 있다면; 내가 proc의 첫 번째 줄에 @@rowcount을 확인할 수 있어야합니까? 그리고 @@rowcount은 트리거에서 실행 된 마지막 SQL 문장을 기반으로 한 값을 가지고 있어야합니까?@@ rowcount가 트리거에서 proc 호출로 지속되어야합니까?

작성하지 않은 proc를 디버깅하고 있습니다. proc의 첫 번째 줄은

입니다. proc는 트리거에 의해 호출됩니다. 무슨 일

INSERT INTO #temp_table (some fields...) 
SELECT some fields.. FROM inserted 

EXEC SOMEPROC 

는 PROC에서 @@rowcount은 항상 0이며 아무것도하지 전에 시저가 종료이다 : 그것은 시저를 호출하기 전에 트리거가 수행하는 마지막 것은이다. 픽스는 방금 @@rowcount 검사를 트리거로 이동시키고 proc에서 꺼내는 것만 큼 쉽습니다.

그러나 처음에는이 방법으로 작성된 이유가 궁금합니다. 거의 어떤 점에서 일하는 것처럼 지금은 그렇지 않습니다. SQL2005와 SQL2008 사이의 동작 또는 일부 시스템 설정이 바뀌 었는지 확인하고보고 싶었습니다. 또는 내 전임자 중 한 명은 작동하지 않는 나쁜 코드를 작성 했습니까?

답변

0

트리거 상태를 확인하는 데 @@ROWCOUNT을 사용하고 싶지 않습니다. 의 절차와 너무 많은 다른 문은 예를 들어 0

해당를 재설정 할 수 있습니다

SELECT TOP (10) name FROM sys.objects; 
SET ANSI_NULLS ON; 
SELECT @@ROWCOUNT; 
---- 
0 

을 오히려 나는 inserted/deleted 의사 테이블을 확인합니다. 따라서, 삽입 또는 갱신 트리거 : 삭제 트리거를

IF EXISTS (SELECT 1 FROM inserted) 
BEGIN 
    ... 

:

IF EXISTS (SELECT 1 FROM deleted) 
BEGIN 
    ... 
+0

대답을 주셔서 감사합니다하지만 난 정말 말 당 솔루션을 찾고되지 않았다. 나는 이것이 효과가 있어야하는지 아닌지에 더 관심이있다. 나는 이것이 최선의 해결책이 아니라는 것에 동의하며 그것을 바꿀 것이다. 그러나 @@ rowcount의 값이 트리거에서 proc 호출까지 지속되어야하는지 묻습니다. – edrazpgh

+0

아니요,'@@ rowcount'는 모든 종류의 명령문을 실행할 때마다 재설정됩니다. 트리거의 EXEC 호출은이를 다시 설정합니다. count를 선택적 매개 변수로 받아들이도록 프로 시저를 변경하려면 rowcount를 채우는 트리거의 명령문 바로 뒤에 SET @localvariable = @@ ROWCOUNT를 설정 한 다음 해당 값을 프로 시저 no에 전달할 수 있습니다 당분간 얼마나 많은 진술이 필요한지 –

+0

실제로 나는 아론이 그의 게시물에서 말한 것에 기초하여 실제로 그것을 알아 냈다고 생각한다. 발동 효과는 @@ 행 개수 확인하기 전에 확약 읽기 설정 트랜잭션 격리 수준에 설정 NOCOUNT를 실행 중입니다. 내가 뒤집 으면 효과가있었습니다. 답변은 그렇습니다. @@ rowcount의 값은 트리거와 proc 사이에서 유지됩니다. 그러나 Aaron은 트리거가 어떤 조치를 취했는지 확인하는 좋은 방법이 아니라고 동의합니다. – edrazpgh

관련 문제