오류 메시지에서 실제 저장 프로 시저 줄 번호를 어떻게 얻을 수 있습니까?
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
'programing' 카테고리의 다른 글
명령 줄에서 java .class를 실행하는 방법 (0) | 2020.08.13 |
---|---|
Python 코드를 한 줄씩 프로파일 링하려면 어떻게해야합니까? (0) | 2020.08.13 |
휘발성은 비쌉니까? (0) | 2020.08.13 |
IntelliJ IDEA : 실행 / 디버그 구성으로 쉘 스크립트 실행 (0) | 2020.08.13 |
특정 디렉토리에서 어떻게 git diff를 수행합니까? (0) | 2020.08.13 |