如何从错误消息中获取实际的存储过程行号?

当我使用Sql Server并且出现错误时,错误消息给出了一个与存储过程中的行号无关的行号。 我认为这个区别是由于空白和评论,但是它是真的吗?

我怎样才能把这两组行号相互关联? 如果有人能给我至less一个正确的方向指针,我会很感激。

我正在使用SQL Server 2005。

TIA!

IIRC,它开始从创build该进程的批处理的开始计数行。 这意味着要么是脚本的开始,要么是create / alter proc语句之前的最后一个“GO”语句。

一个更简单的方法是获取SQL Server在创build对象时使用的实际文本。 切换你的输出到文本模式(CTRL-T与默认的键映射)并运行

sp_helptext proc_name 

将结果复制粘贴到脚本窗口以获得语法高亮等,并使用goto行函数(CTRL-G,我认为)进入报告的错误行。

出于习惯,我把LINENO 0直接放在BEGIN之后的存储过程中。 在这种情况下,将行号重置为零。 然后,只需将错误消息报告的行号添加到您在其中写入LINENO 0和宾果的SSMS中的行号 – 您将在查询窗口中显示错误的行号。

其实这个Error_number()工作得很好。

这个函数从最后一个GO(Batch Separator)语句开始计数,所以如果你没有使用任何Go空格,并且它仍然显示错误的行号 – 那就加上7,就像第7行的存储过程一样,批量分隔符被自动使用。 所以如果你使用Select [Error_Number()+ 7作为Int)作为[Error_Number] – 你会得到所需的答案。

如果使用Catch Block并在Try块内使用RAISERROR()进行任何代码validation,则会在Catch Block所在的位置报告错误行,而不是发生实际错误的位置。 我用这个来清除这个。

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

你可以在catch块中得到这样的错误信息和错误行:

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

长答案:行号是从CREATE PROCEDURE语句中计算出来的,加上在实际运行CREATE语句时可能有的空行或注释行,但不包括GO语句之前的任何行。

我发现使存储过程更容易玩,以确认:

 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 

创build完成后,可以将其切换到ALTER PROCEDURE并在注释上方和第一个GO语句的上方和下方添加一些空行以查看效果。

我注意到一个非常奇怪的事情是,我必须在新的查询窗口中运行EXEC ErrorTesting ,而不是在同一个窗口的底部突出显示它,然后运行…当我这样做时,行号不断增加! 不知道为什么发生..