즉, 내가 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 사이의 동작 또는 일부 시스템 설정이 바뀌 었는지 확인하고보고 싶었습니다. 또는 내 전임자 중 한 명은 작동하지 않는 나쁜 코드를 작성 했습니까?
대답을 주셔서 감사합니다하지만 난 정말 말 당 솔루션을 찾고되지 않았다. 나는 이것이 효과가 있어야하는지 아닌지에 더 관심이있다. 나는 이것이 최선의 해결책이 아니라는 것에 동의하며 그것을 바꿀 것이다. 그러나 @@ rowcount의 값이 트리거에서 proc 호출까지 지속되어야하는지 묻습니다. – edrazpgh
아니요,'@@ rowcount'는 모든 종류의 명령문을 실행할 때마다 재설정됩니다. 트리거의 EXEC 호출은이를 다시 설정합니다. count를 선택적 매개 변수로 받아들이도록 프로 시저를 변경하려면 rowcount를 채우는 트리거의 명령문 바로 뒤에 SET @localvariable = @@ ROWCOUNT를 설정 한 다음 해당 값을 프로 시저 no에 전달할 수 있습니다 당분간 얼마나 많은 진술이 필요한지 –
실제로 나는 아론이 그의 게시물에서 말한 것에 기초하여 실제로 그것을 알아 냈다고 생각한다. 발동 효과는 @@ 행 개수 확인하기 전에 확약 읽기 설정 트랜잭션 격리 수준에 설정 NOCOUNT를 실행 중입니다. 내가 뒤집 으면 효과가있었습니다. 답변은 그렇습니다. @@ rowcount의 값은 트리거와 proc 사이에서 유지됩니다. 그러나 Aaron은 트리거가 어떤 조치를 취했는지 확인하는 좋은 방법이 아니라고 동의합니다. – edrazpgh