복붙노트

[SQL] TRY의 CATCH 안에 단일 문에서 여러 오류 메시지를 캡처

SQL

TRY의 CATCH 안에 단일 문에서 여러 오류 메시지를 캡처

나는 여러 열 및 테이블에 문 일괄 처리를 실행하고 오류가 발생 무엇에 대한 정보를 검색 할하고있다.

성명은 형식 변경 (NVARCHAR에 VARCHAR)이고, 실패하면이 오류를 반환 것으로 보인다.

그러나, 나는 try / catch 블록에서 포장 및 ERROR_MESSAGE ()을 선택하면, 그것은 단지 두 번째 오류를 반환합니다 :

이 훨씬 더 유익 이상적으로 나는 그것이 첫 번째 메시지를 반환 할 것입니다.

정확한 SQL 문은 다음과 같습니다

begin try
    alter table XXX
    alter column YYY
    nvarchar(200)
end try
begin catch
    select ERROR_MESSAGE(), ERROR_LINE(), ERROR_NUMBER(), ERROR_PROCEDURE(), ERROR_SEVERITY(), ERROR_STATE()
end catch

아무도 내가 더 유익한 메시지를 검색 할 수있는 방법을 알고 있나요? (@@ ERROR는 두 번째 오류를 반환)

해결법

  1. ==============================

    1.MikeCov이 대답했다,하지만 난 미래의 문서를 신뢰하지 않았다. 나는이 테스트 실제로 모든 오류 메시지를 반환 않습니다 THROW을 확인할 수 있도록 미래는 지금이다.

    MikeCov이 대답했다,하지만 난 미래의 문서를 신뢰하지 않았다. 나는이 테스트 실제로 모든 오류 메시지를 반환 않습니다 THROW을 확인할 수 있도록 미래는 지금이다.

    당신은 아래의 스크립트를 사용하여이 문제를 재현 할 수 있습니다. 출력을보기 위해 한 번에 댓글을 하나 사이의 각 섹션을 실행합니다.

    /*Create tables */
    
    CREATE TABLE dbo.test 
    (
    columna int primary key
    )
    GO
    
    CREATE TABLE dbo.test2
    (
    columnb int 
    )
    GO
    
    /*Create foreign key between these tables*/
    ALTER TABLE dbo.test2  WITH CHECK ADD  CONSTRAINT [FK_test_to_test] FOREIGN KEY(columnb)
    REFERENCES dbo.test  (columna)
    GO
    ALTER TABLE dbo.test2 CHECK CONSTRAINT [FK_test_to_test] 
    GO
    
    /* TEST 1 - only returns the last error message */
    BEGIN TRY
        ALTER TABLE dbo.test 
        ALTER Column columna varchar
    END TRY
    BEGIN CATCH
        DECLARE  @ERROR_MESSAGE NVARCHAR(2048) = ERROR_MESSAGE()
        RAISERROR (@ERROR_MESSAGE,16,16)
    END CATCH       
    
    /* TEST 2 - Returns both messages, YAY */
    BEGIN TRY
        ALTER TABLE dbo.test 
        ALTER Column columna varchar
    END TRY
    BEGIN CATCH
        THROW;
    END CATCH       
    
    
    /* Clean up */
    DROP TABLE dbo.test2
    DROP TABLE dbo.test 
    
  2. ==============================

    2.사용자의 필요와이 스크립트를 실행하는 계정의 권한에 따라 당신은 DBCC OUTPUTBUFFER (@@ SPID)를 사용할 수 있습니다에서.

    사용자의 필요와이 스크립트를 실행하는 계정의 권한에 따라 당신은 DBCC OUTPUTBUFFER (@@ SPID)를 사용할 수 있습니다에서.

    ERLAND Sommarskog의 오류 처리 문서를 읽을 때 나는이 아이디어를 가로 질러왔다. 그는 프로 시저 spGET_ErrorMessage에 연결합니다.

    불행하게도이 꽤 난 그렇게 확신 버퍼 형식이 변경되지 않은 경우 비록 SQL Server 2008에서 내 테스트 스크립트에서 작동하지 않았다하지만 미세 조정의 비트와 함께이 얻을 수 있습니다!

    CREATE TABLE #foo
    (
    c INT DEFAULT(0)
    )
    ALTER TABLE #foo ALTER COLUMN c VARCHAR(10)
    
    GO
    EXEC spGET_LastErrorMessage
    
    Msg 5074, Level 16, State 1, Line 2
    The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'.
    
        Msg 4922, Level 16, State 9, Line 2
        ALTER TABLE ALTER COLUMN c failed because one or more objects access this column.
    
    errNumber            errState    errLevel    errMessage                                                                               errInstance                                                                                                                     errProcedure    errLine
    -------------------- ----------- ----------- ---------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------- --------------- -----------
    5074                 1           16          The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'.                  MARTINHP                                                                                                                        NULL            2
    4922                 9           16          The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'.ALTER TABL        MARTINHP 䄀䰀吀䔀刀 䌀伀䰀唀䴀一 挀 昀愀椀氀攀搀 戀攀挀愀甀猀攀 漀渀攀 漀爀 洀漀爀攀 漀戀樀攀挀琀猀 愀挀挀攀猀猀 琀栀椀         NULL            117
    
  3. ==============================

    3.나는이 조금 오래 알고 있지만 가치는 여기에 반복. 이는 SQL의 오류 기능의 제한 사항입니다 만, 외모가 미래 버전 해결하고 좋아한다.

    나는이 조금 오래 알고 있지만 가치는 여기에 반복. 이는 SQL의 오류 기능의 제한 사항입니다 만, 외모가 미래 버전 해결하고 좋아한다.

    사회 MSDN 질문 - SQL 내부 예외 오류

  4. from https://stackoverflow.com/questions/3697492/capturing-multiple-error-messages-from-a-single-statement-inside-try-catch by cc-by-sa and MIT license