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)转到报告的错误行.
Vor*_*lic 28
出于习惯,我LINENO 0
直接BEGIN
放在我的存储过程中.在这种情况下,这会将行号重置为零.然后,只需将错误消息报告的行号添加到您编写的SSMS中的行号LINENO 0
和宾果游戏中 - 您有查询窗口中显示的错误行号.
小智 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)
在 TSQL/存储过程中
您可能会收到如下错误:
Msg 206, Level 16, State 2, Procedure myproc, Line 177 [Batch Start Line 7]
这意味着错误在批处理中的第 177 行。SQL 中不是 177。在我的情况下,您应该看到批处理开始的行号 [7],然后将该值添加到行号以找出错误的语句