TSQL에서 PRINT 버퍼를 플러시하는 방법
SQL Server 2005에 장기간 실행 중인 저장 프로시저가 있어 디버깅을 시도하고 있으며, 이를 위해 print 명령을 사용하고 있습니다.문제는 spro의 맨 끝에 있는 SQL Server에서만 메시지를 돌려받을 수 있다는 것입니다. spro의 맨 끝에 있는 것이 아니라 실행 중에 메시지 버퍼를 플러시하고 이러한 메시지를 바로 볼 수 있어야 합니다.
다음 기능을 사용합니다.
RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT
모든 지문을 건포도 오류로 완전히 바꾸면 안 됩니다.루프나 큰 커서가 있는 경우는, 1회 또는 2회, 또는 몇회 반복할 때마다 실행할 수 있습니다.
「RAIDERROR」: 「RAIDERROR」를 선택합니다.SQL Server를 사용하세요.읽을 가치가 있습니다.
http://www.sommarskog.se/error-handling-I.htmlhttpwww.sommarskog.se/.html
@JoelCoehoorn의 답변을 바탕으로 모든 PRINT 스테이트먼트를 그대로 두고 단순히 RAISERROR 스테이트먼트를 따라 플래시를 발생시키는 것입니다.
예를 들어 다음과 같습니다.
PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT
이 방법의 장점은 PRINT 문이 문자열을 연결할 수 있는 반면 RAISERROR은 연결할 수 없다는 것입니다.(어느 쪽이든, RAISERROR에서 사용할 변수를 선언하고 설정해야 하는 것과 같은 수의 코드를 가지고 있습니다).
저처럼 AutoHotKey 또는 SSMSBoost 또는 이와 동등한 도구를 사용하는 경우 "]flush"와 같은 바로 가기를 쉽게 설정하여 RAIDERROR 행에 입력할 수 있습니다.따라서 매번 같은 줄의 코드일 경우, 즉 특정 텍스트나 변수를 유지하도록 사용자 정의할 필요가 없습니다.
네... 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 또는 RAIDERROR에 의존하지 않고 TempDB의 ##Temp 테이블 또는 데이터베이스의 영구 테이블에 "Print" 스테이트먼트를 로드하면 다른 창에서 SELECT 스테이트먼트를 통해 데이터를 바로 볼 수 있습니다.저는 이게 제일 좋아요.영구 테이블을 사용하면 과거에 발생한 일에 대한 로그로도 사용할 수 있습니다.인쇄문은 오류 발생 시 편리하지만 로그 테이블을 사용하여 특정 실행에 대해 마지막으로 기록된 값을 기준으로 정확한 오류 지점을 확인할 수도 있습니다(로그 테이블에서 전체 실행 시작 시간을 추적하는 경우).
참고로 스토어드 프로시저가 아닌 스크립트(배치 처리)로 작업하는 경우, 예를 들어 GO 명령에 의해 플러시 출력이 트리거됩니다.
print 'test'
print 'test'
go
일반적으로 결론은 다음과 같습니다.SMS GUI 또는 sqlcmd.exe에서 실행되는 mssql 스크립트 실행의 출력은 첫 번째 GO 문의 파일, stdoutput, gui 창 또는 스크립트가 끝날 때까지 플러시됩니다.
저장 프로시저 내부의 플러시는 내부에 GO를 배치할 수 없기 때문에 다르게 작동합니다.
참조: tsql Go 스테이트먼트
Eric Isaac의 답변을 확장하기 위해 테이블 방식을 올바르게 사용하는 방법은 다음과 같습니다.
첫째, SP가 트랜잭션을 사용하는 경우 테이블 내용을 실시간으로 모니터링할 수 없습니다.READ UNCOMMITTED
옵션:
SELECT *
FROM table_log WITH (READUNCOMMITTED);
또는
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT *
FROM table_log;
롤백 문제를 해결하려면 로그 테이블에 증가 ID를 입력하고 다음 코드를 사용합니다.
SET XACT_ABORT OFF;
BEGIN TRY
BEGIN TRANSACTION mytran;
-- already committed logs are not affected by a potential rollback
-- so only save logs created in this transaction
DECLARE @max_log_id = (SELECT MAX(ID) FROM table_log);
/*
* do stuff, log the stuff
*/
COMMIT TRANSACTION mytran;
END TRY
BEGIN CATCH
DECLARE @log_table_saverollback TABLE
(
ID INT,
Msg NVARCHAR(1024),
LogTime DATETIME
);
INSERT INTO @log_table_saverollback(ID, Msg, LogTime)
SELECT ID, Msg, LogTime
FROM table_log
WHERE ID > @max_log_id;
ROLLBACK TRANSACTION mytran; -- this deletes new log entries from the log table
SET IDENTITY_INSERT table_log ON;
INSERT INTO table_log(ID, Msg, LogTime)
SELECT ID, Msg, LogTime
FROM @log_table_saverollback;
SET IDENTITY_INSERT table_log OFF;
END CATCH
다음의 중요한 정보에 주의해 주세요.
SET XACT_ABORT OFF;
SQL Server가 catch 블록을 실행하는 대신 전체 트랜잭션을 종료하는 것을 방지합니다.이 기술을 사용하는 경우 항상 이 블록을 포함합니다.- 를 사용하다
@table_variable
, 가 아닙니다.#temp_table
. 임시 테이블도 롤백의 영향을 받습니다.
언급URL : https://stackoverflow.com/questions/306945/how-do-i-flush-the-print-buffer-in-tsql
'programing' 카테고리의 다른 글
VB의 C# 버전은 무엇입니까?NET의 Input Box? (0) | 2023.04.07 |
---|---|
varchar와 nvarchar의 차이점은 무엇입니까? (0) | 2023.04.07 |
GETDA를 사용하여 스토어드 프로시저를 호출하는 '' 근처의 구문이 잘못되었습니다.TE (0) | 2023.04.07 |
WordPress에서 파일 경로별로 첨부 파일 ID 가져오기 (0) | 2023.03.18 |
리액트 라우터 프라이빗루트/리다이렉트가 기능하지 않음 (0) | 2023.03.18 |