programing

오류 메시지에서 실제 저장 프로 시저 줄 번호를 어떻게 얻을 수 있습니까?

nasanasas 2020. 8. 13. 23:27
반응형

오류 메시지에서 실제 저장 프로 시저 줄 번호를 어떻게 얻을 수 있습니까?


Sql Server를 사용할 때 오류가 발생하면 오류 메시지가 저장 프로 시저의 줄 번호와 상관 관계가없는 줄 번호를 제공합니다. 그 차이는 공백과 주석 때문이라고 생각하지만 정말입니까?

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

SQL Server 2005를 사용하고 있습니다.

TIA!


IIRC, 해당 proc을 생성 한 배치의 시작부터 라인 계산을 시작합니다. 즉, 스크립트의 시작 또는 create / alter proc 문 이전의 마지막 "GO"문을 의미합니다.

이를 확인하는 더 쉬운 방법은 SQL Server가 개체를 만들 때 사용한 실제 텍스트를 가져 오는 것입니다. 출력을 텍스트 모드 (기본 키 매핑을 사용하는 CTRL-T)로 전환하고 실행합니다.

sp_helptext proc_name

구문 강조 등을 얻기 위해 스크립트 창에 결과를 복사하고보고 된 오류 줄로 이동하려면 goto line 함수 (제 생각에는 CTRL-G)를 사용합니다.


습관적으로 저장 프로 시저에 LINENO 0직접 넣습니다 BEGIN. 이 경우 행 번호가 0으로 재설정됩니다. 그런 다음 오류 메시지로보고 된 줄 번호를 SSMS의 줄 번호에 추가 LINENO 0하고 빙고하면 쿼리 창에 표시된 오류 줄 번호가 있습니다.


실제로 이것은 Error_number()매우 잘 작동합니다.

이 함수는 마지막 GO (Batch Separator) 문에서 카운트를 시작하므로 Go 공백을 사용하지 않았고 여전히 잘못된 줄 번호가 표시되는 경우 7 번 줄의 저장 프로 시저에서와 같이 일괄 구분 기호에 7을 추가합니다. 자동으로 사용됩니다. 따라서 Select Cast (Error_Number () + 7 as Int)를 [Error_Number]로 사용하면 원하는 답을 얻을 수 있습니다.


Catch 블록을 사용하고 Try 블록 내에서 코드 유효성 검사에 RAISERROR ()를 사용하면 오류 라인이 실제 오류가 발생한 위치가 아니라 Catch 블록이있는 위치에보고됩니다. 나는 그것을 정리하기 위해 이것을 사용했습니다.

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

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

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())

긴 대답 : 줄 번호는 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은 동일한 창의 맨 아래에 강조 표시하고 실행 하는 대신 새 쿼리 창에서 실행해야한다는 것입니다. 이렇게하면 줄 번호가 계속 올라갑니다! 왜 그랬는지 모르겠네요 ..


다음과 같이 catch 블록에서 오류 메시지와 오류 줄을 얻을 수 있습니다.

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())

TSQL / 저장 프로 시저에서

You may get an error such as:

Msg 206, Level 16, State 2, Procedure myproc, Line 177 [Batch Start Line 7]

This means that the error is on line 177 in the batch. Not 177 in the SQL. You should see what line number your batch starts on, in my case [7], and then you add that value to the line number to find what statement is wrong

참고URL : https://stackoverflow.com/questions/4565614/how-can-i-get-the-actual-stored-procedure-line-number-from-an-error-message

반응형