[sql-server] TSQL에서 PRINT 버퍼를 어떻게 플러시합니까?
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 함수의 첫 번째 매개 변수에는 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 문은 오류에 유용하지만 로그 테이블을 사용하면 해당 특정 실행에 대해 마지막으로 기록 된 값을 기반으로 정확한 실패 지점을 확인할 수도 있습니다 (로그 테이블에서 전체 실행 시작 시간을 추적한다고 가정).
답변
참고로, 스토어드 프로 시저가 아닌 스크립트 (일괄 처리)에서 작업하는 경우 플러싱 출력이 GO 명령에 의해 트리거됩니다 (예 :
print 'test'
print 'test'
go
일반적으로 내 결론은 다음과 같습니다. SMS GUI 또는 sqlcmd.exe로 실행되는 mssql 스크립트 실행 출력은 첫 번째 GO 문에서 파일, stdoutput, gui 창으로 또는 스크립트 끝까지 플러시됩니다.
GO를 넣을 수 없으므로 저장 프로 시저 내부의 플러싱 기능이 다르게 작동합니다.
참조 : tsql Go 문