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

cha*_*ama 104 sql sql-server-2005

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

如何将这两组行号相互关联?如果有人能给我一个正确方向的指针,我真的很感激.

我正在使用sql server 2005.

TIA!

Ric*_*ick 111

IIRC,它开始计算从创建该proc的批处理开始的行.这意味着要么是脚本的开头,要么是创建/更改proc语句之前的最后一个"GO"语句.

一种更简单的方法是拉取SQL Server在创建对象时使用的实际文本.将输出切换到文本模式(使用默认键映射的CTRL-T)并运行

sp_helptext proc_name
Run Code Online (Sandbox Code Playgroud)

复制将结果粘贴到脚本窗口以获取语法突出显示等,并使用goto行函数(我认为CTRL-G)转到报告的错误行.

  • 当我在网格输出模式下执行此操作时,它也会将行号粘在上面 (14认同)
  • @codeulike - 好点,如果使用网格输出,行号将与行号匹配,因此您不需要使用CTRL + G. 我唯一的Grid输出问题是它将TAB字符更改为单个SPACE,因此您将丢失所有格式. (2认同)

Vor*_*lic 28

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

  • 为什么不直接输入“LineNo X”,其中 X= 您放置语句的行号,以便它自动添加到报告的行号中? (4认同)

小智 6

实际上这Error_number()很有效.

此函数从上一个GO(批处理分隔符)语句开始计数,因此如果您没有使用任何Go空格并且它仍显示错误的行号 - 则向其添加7,如第7行中的存储过程中的批处理分隔符自动使用.因此,如果您使用选择Cast(Error_Number()+ 7作为Int)作为[Error_Number] - 您将获得所需的答案.


小智 5

如果您使用Catch Block并在Try Block中使用RAISERROR()进行任何代码验证,则会在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
Run Code Online (Sandbox Code Playgroud)


jas*_*tim 5

在 TSQL/存储过程中

您可能会收到如下错误:

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

这意味着错误在批处理中的第 177 行。SQL 中不是 177。在我的情况下,您应该看到批处理开始的行号 [7],然后将该值添加到行号以找出错误的语句