복붙노트

[SQL] 어떻게 오류 메시지의 실제 저장 프로 시저의 줄 번호를받을 수 있나요?

SQL

어떻게 오류 메시지의 실제 저장 프로 시저의 줄 번호를받을 수 있나요?

나는 SQL Server를 사용하고 오류가있을 경우, 오류 메시지가 저장 프로 시저의 줄 번호에 상관 관계가없는 줄 번호를 제공합니다. 나는 차이가 공백과 코멘트에 기인하지만, 정말 가정?

어떻게 서로 행 번호를 두 세트를 관련시킬 수? 누군가가 나에게 올바른 방향으로 적어도 포인터를 줄 수 있다면 정말 감사하겠습니다.

나는 SQL 서버 2005을 사용하고 있습니다.

해결법

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

    1.IIRC, 그것은 PROC 것을 만든 배치의 시작부터 계산 라인을 시작합니다. 그 수단 스크립트의 시작, 그렇지 않으면이 작성하기 전에 마지막으로 "GO"문 / ALTER PROC 문 중 하나.

    IIRC, 그것은 PROC 것을 만든 배치의 시작부터 계산 라인을 시작합니다. 그 수단 스크립트의 시작, 그렇지 않으면이 작성하기 전에 마지막으로 "GO"문 / ALTER PROC 문 중 하나.

    그것을 볼 수있는 쉬운 방법은 개체를 만들 때 SQL 서버가 사용하는 실제 텍스트를 당겨하는 것입니다. 텍스트 모드 (기본 키 매핑으로 CTRL-T) 및 실행에 출력을 전환

    sp_helptext proc_name
    

    복사 구문 강조 등을 얻을 수있는 스크립트 창에 결과를 붙여보고 된 오류 라인으로 이동 (I 생각 CTRL-G) 고토 라인 기능을 사용합니다.

  2. ==============================

    2.습관 I 장소 LINENO 0 중 직접 후 내 저장 프로 시저 시작합니다. 이 경우, 제로 -이 행 번호를 다시 설정합니다. 쿼리 창에 표시된대로 오류의 줄 번호를 가지고 - 그럼 당신이 LINENO 0 빙고를 썼다 SSMS에서 행 번호에 오류 메시지가보고 한 줄 번호를 추가 할 수 있습니다.

    습관 I 장소 LINENO 0 중 직접 후 내 저장 프로 시저 시작합니다. 이 경우, 제로 -이 행 번호를 다시 설정합니다. 쿼리 창에 표시된대로 오류의 줄 번호를 가지고 - 그럼 당신이 LINENO 0 빙고를 썼다 SSMS에서 행 번호에 오류 메시지가보고 한 줄 번호를 추가 할 수 있습니다.

  3. ==============================

    3.당신은 실제 오류가 발생한 곳 캐치 블록이 아닌 경우 블록이 다음 오류 라인이보고 가져옵니다 시도 내에서 모든 코드 유효성 검사 () 캐치 블록을 사용하고 RAISERROR를 사용합니다. 나는 그것을 정리하기 위해이처럼 사용했다.

    당신은 실제 오류가 발생한 곳 캐치 블록이 아닌 경우 블록이 다음 오류 라인이보고 가져옵니다 시도 내에서 모든 코드 유효성 검사 () 캐치 블록을 사용하고 RAISERROR를 사용합니다. 나는 그것을 정리하기 위해이처럼 사용했다.

    BEGIN CATCH
      DECLARE @ErrorMessage NVARCHAR(4000);
      DECLARE @ErrorSeverity INT;
      DECLARE @ErrorState INT;
    
      SELECT 
         @ErrorMessage = ERROR_MESSAGE() + ' occurred at Line_Number: ' + CAST(ERROR_LINE() AS VARCHAR(50)),
         @ErrorSeverity = ERROR_SEVERITY(),
         @ErrorState = ERROR_STATE();
    
      RAISERROR (@ErrorMessage, -- Message text.
         @ErrorSeverity, -- Severity.
         @ErrorState -- State.
      );
    
    END CATCH
    
  4. ==============================

    4.사실이 ERROR_NUMBER ()는 아주 잘 작동합니다.

    사실이 ERROR_NUMBER ()는 아주 잘 작동합니다.

    다음 줄 번호 7 배치 분리기에 저장 프로 시저, 그것은 7을 추가 -이 기능은 어떤 이동 공간을 사용하지 않은 그것은 여전히 ​​잘못된 줄 번호를 보여주고 만약 그렇다면, 마지막 GO (일괄 분리) 문에서 카운트를 시작합니다 자동으로 사용됩니다. 사용한다면 로 (int로서 ERROR_NUMBER () + 7) 캐스트를 선택 [ERROR_NUMBER는] - 당신이 원하는 답변을 얻을 것입니다.

  5. ==============================

    5.ALL IN / Protsedures를 저장

    ALL IN / Protsedures를 저장

    당신은 오류가 같은 얻을 수 있습니다 :

    이 수단 오류가 일괄 라인 177에 있는지. 아니 177 SQL있다. 당신은 내 경우 [7]에에 무엇을 줄 수 일괄 시작을 볼 수, 그리고 당신은 문이 무엇이 잘못되었는지 찾기 위해 행 번호에 해당 값을 추가

  6. ==============================

    6.당신은이를 사용할 수 있습니다

    당신은이를 사용할 수 있습니다

    CAST(ERROR_LINE() AS VARCHAR(50))
    

    당신은 오류 로그 테이블이 사용할 수 있도록하려는 경우 :

    INSERT INTO dbo.tbname( Source, Message) VALUES ( ERROR_PROCEDURE(), '[ ERROR_SEVERITY : ' + CAST(ERROR_SEVERITY() AS VARCHAR(50)) + ' ] ' + '[ ERROR_STATE : ' + CAST(ERROR_STATE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_PROCEDURE : ' + CAST(ERROR_PROCEDURE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(50)) + ' ] ' +  '[ ERROR_LINE : ' + CAST(ERROR_LINE() AS VARCHAR(50)) + ' ] ' + ERROR_MESSAGE())
    
  7. ==============================

    7.긴 대답 : 줄 번호가에서 카운트는이 CREATE PROCEDURE 문, 플러스 실제로는 CREATE 문을 실행하지만, GO 문 앞에있는 줄을 계산하지 않을 경우 빈 행이나 주석 행은 당신이 그 위에했을 수 ...

    긴 대답 : 줄 번호가에서 카운트는이 CREATE PROCEDURE 문, 플러스 실제로는 CREATE 문을 실행하지만, GO 문 앞에있는 줄을 계산하지 않을 경우 빈 행이나 주석 행은 당신이 그 위에했을 수 ...

    나는 그것이 훨씬 더 쉽게 확인에 놀러 proc 디렉토리에 저장을 발견 :

    GO
    
    -- =============================================
    -- Author:          <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:     <Description,,>
    -- =============================================
    CREATE PROCEDURE ErrorTesting
           -- Add the parameters for the stored procedure here
    AS
    BEGIN
           -- SET NOCOUNT ON added to prevent extra result sets from
           -- interfering with SELECT statements.
           SET NOCOUNT ON;
    
           -- Insert statements for procedure here
           SELECT 1/0
    
    END
    GO
    

    당신이 그것을 만든 후에는 ALTER PROCEDURE로 전환하고 효과를 볼 수있는 첫 번째 GO 문 주석의 위의 위 아래에 약간의 빈 라인을 추가 할 수 있습니다.

    내가 발견 한 아주 이상한 것은 내가 같은 창 하단에 그것을 강조하고 실행하는 대신 새 쿼리 창에서 EXEC ErrorTesting를 실행해야한다고했다 ... 나는 줄 번호가 올라가고 보관 것을했을 때! 확실하지 그 일이 왜 ..

  8. ==============================

    8.당신은 오류 메시지와 같은 catch 블록에서 오류 라인을 얻을 수 있습니다 :

    당신은 오류 메시지와 같은 catch 블록에서 오류 라인을 얻을 수 있습니다 :

    'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
    
  9. from https://stackoverflow.com/questions/4565614/how-can-i-get-the-actual-stored-procedure-line-number-from-an-error-message by cc-by-sa and MIT license