SQL Server 2005에서 디버깅하려고하는 매우 오래 실행되는 저장 프로 시저가 있으며 'print'명령을 사용하여 수행하고 있습니다. 문제는 sproc의 맨 마지막에 SQL Server에서 메시지를 다시 가져 오는 것입니다. 메시지 버퍼를 플러시하고 sproc의 런타임 중에 메시지 버퍼를 플러시하고 즉시 볼 수 있기를 바랍니다. 종료.
SQL Server 2005에서 디버깅하려고하는 매우 오래 실행되는 저장 프로 시저가 있으며 'print'명령을 사용하여 수행하고 있습니다. 문제는 sproc의 맨 마지막에 SQL Server에서 메시지를 다시 가져 오는 것입니다. 메시지 버퍼를 플러시하고 sproc의 런타임 중에 메시지 버퍼를 플러시하고 즉시 볼 수 있기를 바랍니다. 종료.
답변:
RAISERROR
기능을 사용하십시오 :
RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT
모든 지문을 raiserror로 완전히 교체해서는 안됩니다. 루프 또는 큰 커서가 어딘가에 있으면 반복마다 한 번 또는 두 번 또는 심지어 여러 번 반복하십시오.
또한 :이 링크에서 RAISERROR에 대해 처음 알게되었습니다.이 링크는 이제 SQL Server 오류 처리에 대한 결정적인 소스를 고려하고 읽을 가치가 있습니다 .http :
//www.sommarskog.se/error-handling-I.html
@JoelCoehoorn의 답변을 바탕으로 내 접근 방식은 모든 PRINT 문을 그대로두고 RAISERROR 문으로 플러시를 수행하는 것입니다.
예를 들면 다음과 같습니다.
PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT
이 방법의 장점은 PRINT 문이 문자열을 연결할 수 있지만 RAISERROR는 문자열을 연결할 수 없다는 것입니다. (따라서 RAISERROR에서 사용할 변수를 선언하고 설정해야하므로 동일한 수의 코드 줄을 갖게됩니다).
나와 같이 AutoHotKey 또는 SSMSBoost 또는 이와 동등한 도구를 사용하는 경우 "] flush"와 같은 바로 가기를 쉽게 설정하여 RAISERROR 줄을 입력 할 수 있습니다. 이렇게하면 매번 같은 코드 행인 경우 시간을 절약 할 수 있습니다. 즉, 특정 텍스트 나 변수를 보유하도록 사용자 정의 할 필요가 없습니다.
RAISERROR()
지원하지 않습니다 printf()
스타일의 문자열 보간. 예를 들어, 경우는 @MyVariableName
stringish 유형 (예를 들면, 인 VARCHAR(MAX)
, NVARCHAR(MAX)
등), 당신은 사용할 수 있습니다 RAISERROR()
: 하나 개의 라인은 RAISERROR(N'MyVariableName: %s', 0, 1, @MyVariableName)
.
예 ... RAISERROR 함수의 첫 번째 매개 변수에는 NVARCHAR 변수가 필요합니다. 따라서 다음을 시도하십시오.
-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = 'Here''s your message...'
RAISERROR (@strMsg, 0, 1) WITH NOWAIT
또는
RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT
PRINT 또는 RAISERROR에 의존하지 않고 "print"문을 TempDB의 ## Temp 테이블 또는 데이터베이스의 영구 테이블에로드하면 다른 창에서 SELECT 문을 통해 즉시 데이터를 볼 수 있습니다. . 이것은 나에게 가장 효과적입니다. 영구 테이블을 사용하면 과거에 발생한 일에 대한 로그 역할도합니다. print 문은 오류에 유용하지만 로그 테이블을 사용하면 해당 특정 실행에 대해 마지막으로 기록 된 값을 기반으로 정확한 실패 지점을 확인할 수도 있습니다 (로그 테이블에서 전체 실행 시작 시간을 추적한다고 가정).
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
모니터링 세션에서 사용하여 라이브 쿼리 할 수 있습니다
READ UNCOMMITTED
트랜잭션 의 데이터 를 다른 테이블 에 복사 할 수도 있지만 직전의 순간을 놓칠 수도 ROLLBACK
있습니다. 그래서 아마도 '얼마나 멀리?' 왜 롤백이 아닌가?
참고로, 스토어드 프로 시저가 아닌 스크립트 (일괄 처리)에서 작업하는 경우 플러싱 출력이 GO 명령에 의해 트리거됩니다 (예 :
print 'test'
print 'test'
go
일반적으로 내 결론은 다음과 같습니다. SMS GUI 또는 sqlcmd.exe로 실행되는 mssql 스크립트 실행 출력은 첫 번째 GO 문에서 파일, stdoutput, gui 창으로 또는 스크립트 끝까지 플러시됩니다.
GO를 넣을 수 없으므로 저장 프로 시저 내부의 플러싱 기능이 다르게 작동합니다.
참조 : tsql Go 문
go
출력을 플러시하지 않고 제공된 링크에 따라 배치를 종료합니다. 당신은 아무것도 declare
D를 디버깅 때문에 매우 사용할 수 없습니다, 삭제됩니다. 새로운 배치에 있기 때문에 declare @test int print "I want to read this!" go set @test=5
오류 주장 @test
이 정의되지 않은 것입니다.