source

인쇄 문으로 저장 프로시저를 디버깅하는 방법은 무엇입니까?

ittop 2023. 8. 10. 21:30
반응형

인쇄 문으로 저장 프로시저를 디버깅하는 방법은 무엇입니까?

SQL Server Management Studio 2008의 저장 프로시저를 디버깅하려고 합니다.잘못된 IF 문을 테스트하기 위해 인쇄 문을 삽입하려고 합니다.

디버깅을 수행하기 위해, 저는 다음을 사용해 보았습니다.PRINT '5'지휘권

사용해 보았습니다.RAISERROR맘에 들다'RAISERROR (N'Start',10,1) WITH NOWAIT'.

그러나 이것들은 인쇄물을 보여주지 않았고 결과 세트만 보여주었습니다.그 메시지는 방금 말했습니다.1 row affected.

코드를 다음과 같이 작성하려고 했습니다(아마 잘못된 접근 방식일 것입니다).

SET NOCOUNT ON         
RAISERROR (N'Start',10,1) WITH NOWAIT    
DECLARE @DocHandle INT        
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT        
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit   

저장 프로시저를 디버그하기 위해 인쇄 문을 사용하는 가장 좋은 방법은 무엇입니까?

Microsoft SSMS(SQL Server Management Studio)를 사용하는 경우 인쇄 문은 결과 탭이 아닌 메시지 탭 아래에 인쇄됩니다.

enter image description here

여기에 인쇄 문이 나타납니다.

다음은 인쇄 문 사용의 예입니다.이전 사용자가 표시한 대로 메시지 탭 아래에 나타납니다.

Declare @TestVar int = 5;

print 'this is a test message';
print @TestVar;
print 'test-' + Convert(varchar(50), @TestVar);

Print Messages

제가 반복된 답변에 도달하기 전에, 제가 여기서 받아들일 수 있는 유일한 답변은 위의 KM의 답변임을 고백합니다.저는 다른 답들 중 아무도 실제로 질문에 대답하지 않았거나 적절하지 않았기 때문에 반대표를 던졌습니다.PRINT 출력은 메시지 창에 실제로 표시되지만, 이는 전혀 요청된 내용이 아닙니다.

저장 프로시저를 실행하는 동안 PRINT 문 출력이 표시되지 않는 이유는 무엇입니까?
이 답변의 간략한 내용은 저장 프로시저의 실행을 SQL 서버로 전송하고 전체 트랜잭션이 완료될 때까지 응답하지 않는다는 것입니다.다음은 이 외부 링크에 있는 더 나은 답변입니다.

  • 더 많은 의견/견적이 필요한 경우 여기에 있는 SO 게시물에 주의를 기울이십시오.
  • 구체적으로 Phil_factor의 같은 글의 이 답변을 보세요 (하하! SQL 유머가 너무 좋아요)
  • RAISERROR WITH NOWAIT 사용 제안과 관련하여 짐 카든의 같은 게시물의 이 답변을 보십시오.

이런 짓 하지 마

  1. 일부 사람들은 인쇄문 뒤에 GO 문을 사용하면 된다는 인상을 받지만 저장 프로시저 내부에서는 GO 문을 사용할 수 없습니다.그래서 그 해결책은 나왔습니다.
  2. 인쇄 문을 선택하는 것은 무의미한 결과 집합을 흐리게 할 뿐이며 나중에 프로그램에서 저장 프로시저를 사용해야 하는 경우 데이터 판독기에서 결과를 루프할 때 건너뛸 결과 집합을 알아야 하기 때문에 권장하지 않습니다.이건 나쁜 생각일 뿐이니, 하지 마세요.
  3. 인쇄 문을 선택할 때의 또 다른 문제는 인쇄 문이 항상 즉시 나타나지 않는다는 것입니다.저는 다른 실행에 대해 다른 경험을 가지고 있으므로 이 방법론과 일관성을 기대하지 마십시오.

프로시저 에▁altern▁of장대안▁inside한대▁toative▁a▁print저▁procedure▁print로.
제 생각에 이것은 좀 까다로운 작업입니다. 왜냐하면 구문이 사용되는 맥락에서 혼란스럽기 때문입니다. 하지만 미래에 마이크로소프트에 의해 업데이트될 수도 있다는 것을 누가 알겠어요.디버그 정보를 출력하기 위한 유일한 목적으로 오류를 제기하는 것이 싫을 뿐입니다.

수 있는 한 방법은 이미 번 으로 보입니다예를 들어 이 접근 방식에 대한 작은 문제를 지적합니다.

ALTER
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample]
AS
BEGIN
    SET NOCOUNT ON;

    -- This will print immediately
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT
    SELECT 1;

    -- Five second delay to simulate lengthy execution
    WAITFOR DELAY '00:00:05'

    -- This will print after the five second delay
    RAISERROR ('RE End', 0, 1) WITH NOWAIT
    SELECT 2;
END

GO

EXEC [dbo].[PrintVsRaiseErrorSprocExample]

두 SELECT 문 결과는 실행이 완료된 후에만 표시되며 인쇄 문은 위에 표시된 순서대로 표시됩니다.

» »
PRINT 문과 RAISEROR 문이 모두 차례로 있다고 가정해 보겠습니다. 그런 다음 둘 다 인쇄됩니다.버퍼링과 관련이 있을 것입니다. 그러나 이러한 상황이 발생할 수 있습니다.

ALTER
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2]
AS
BEGIN
    SET NOCOUNT ON;

    -- Both the PRINT and RAISERROR statements will show
    PRINT 'P Start';
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT
    SELECT 1;

    WAITFOR DELAY '00:00:05'

    -- Both the PRINT and RAISERROR statements will show
    PRINT 'P End'
    RAISERROR ('RE End', 0, 1) WITH NOWAIT
    SELECT 2;
END

GO

EXEC [dbo].[PrintVsRaiseErrorSprocExample2]

따라서 PRINT와 RAISHERROR를 모두 사용하지 말고 둘 중 하나만 선택하면 됩니다.저장 프로시저 실행 중에 출력을 표시하려면 RAISEROR WITH NOWAIT를 사용합니다.

사용해 보십시오.

RAISERROR('your message here!!!',0,1) WITH NOWAIT

기본 도구 모음의 "실행" 오른쪽에 있는 몇 개의 아이콘인 "결과를 텍스트로"로 전환할 수도 있습니다.

위의 두 가지를 모두 사용한 상태에서 메시지가 나타나지 않으면 편집 중인 프로시저의 서버/데이터베이스/소유자 버전을 실행 중인지 확인합니다.RAISERROR 명령을 누르고 있는지 확인하고, 이 명령을 절차 내의 첫 번째 명령으로 만듭니다.

그렇지 않으면 테이블을 만들 수 있습니다.

create table temp_log (RowID int identity(1,1) primary key not null
                      , MessageValue varchar(255))

그러면:

INSERT INTO temp_log VALUES ('Your message here')

그런 다음 절차를 실행한 후(롤백이 제공되지 않는 경우), 그냥select

MSDN 설명서의 다음 사용 방법을 참조하십시오.Transact-SQL 디버거를 실행합니다. PRINT 문은 없지만 코드를 디버깅하는 데 도움이 될 수 있습니다.

이 YouTube 동영상:SQL Server 2008 T-SQL 디버거는 디버거의 사용을 보여줍니다.

=> 저장 프로시저는 Transact-SQL로 작성됩니다.이를 통해 모든 Transact-SQL 코드를 디버깅할 수 있으므로 중단점을 정의하고 변수를 관찰하여 Visual Studio에서 디버깅하는 것과 같습니다.

언급URL : https://stackoverflow.com/questions/15412804/how-to-debug-stored-procedures-with-print-statements

반응형