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


110

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

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

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


1
줄 번호는 proc의 본문과 관련이 있다고 생각합니다. 즉 헤더를 무시합니다.
Martin Smith

아마도 stackoverflow.com/questions/4550342/… 가 도움이 될 것입니다.
John Saunders

헤더는 어디에서 끝나나요? 변경 절차를 따르는 시작 후 ... AS?
chama

create proc내 테스트 의 라인에서 계산을 시작하는 것 같았습니다 . 나는 당신이 뭔가 다른 것을보고 있다고 가정합니다.
Martin Smith

1
여기 내 대답에 설명 : stackoverflow.com/questions/2947173/…
gbn

답변:


113

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

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

sp_helptext proc_name

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


14
내가 그리드 출력 모드에서 이런 짓을 할 때, 너무에서 줄 번호가 붙어
codeulike

2
@codeulike-좋은 점, 그리드 출력을 사용하면 행 번호가 행 번호와 일치하므로 CTRL + G를 사용할 필요가 없습니다. 그리드 출력의 유일한 문제는 TAB 문자를 단일 공백으로 변경하므로 모든 서식이 손실된다는 것입니다.
Rick

32

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


4
보고 된 줄 번호에 자동으로 추가되도록 "LineNo X"를 입력하십시오. 여기서 X = 문장을 입력 한 줄 번호입니다.
LarryBud

8

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

6

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

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


1
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.-이게 무슨 뜻이야?
underscore_d

4

TSQL / 저장 프로 시저에서

다음과 같은 오류가 발생할 수 있습니다.

메시지 206, 수준 16, 상태 2, 절차 myproc, 줄 177 [일괄 시작 줄 7]

이는 오류가 배치의 177 행에 있음을 의미합니다. SQL에서 177이 아닙니다. 제 경우 [7]에서 배치가 시작되는 줄 번호를 확인한 다음 해당 값을 줄 번호에 추가하여 잘못된 문장을 찾습니다.


2

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

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

4
ERROR_LINE ()은 저장 프로 시저 내 TRY / CATCH의 CATCH 부분에서만 사용할 수 있습니다. 보고하는 줄 번호는 오류를 발견하지 못한 경우 SQL Server가 반환하는 것과 동일합니다. 따라서 유용 할 수 있지만이 질문을 해결하는 데 도움이되지 않습니다.
Rick

1

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


1

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

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.