如何从正在执行的存储过程中获取当前行号

JJS*_*JJS 8 sql-server stored-procedures t-sql

是否有函数或关键字可以让我获取存储过程中的当前行号?

我知道有一个未公开的LineNo函数允许您设置行号,并影响系统错误消息的输出 /sf/ask/283815801/ - 字做

我知道有一个功能,ERROR_LINE()这是一个可用的内部BEGIN CATCH ... END CATCH

ERROR_LINE()做我需要的,但我想从 CATCH 块之外使用它。文件中的任何位置。

 DECLARE @InsertSource VARCHAR(1000) = object_name(@@procid)
 EXEC PROC_Accounting_Transaction_Insert ... other parameters..., @InsertSource
Run Code Online (Sandbox Code Playgroud)

目前我只是硬编码调用#,因为它出现在存储过程主体中,但它很快就变老了。

DECLARE @InsertSource VARCHAR(1000) 

SET @InsertSource = object_name(@@procid) + '#1'
EXEC ...

SET @InsertSource = object_name(@@procid) + '#2'
EXEC ...
Run Code Online (Sandbox Code Playgroud)

JJS*_*JJS 7

Adam Machanic通过电子邮件向我发送了此信息

DECLARE @lineno INT
BEGIN TRY SET @lineno = 1/0 END TRY BEGIN CATCH SET @lineno = ERROR_LINE() END CATCH
Run Code Online (Sandbox Code Playgroud)

它确实可以作为我书中的一行。

根据 @ScottGartner 的说法,这是一句真正的俏皮话。

BEGIN TRY print 1/0; END TRY BEGIN CATCH print 'Line Number: ' + CAST(ERROR_LINE() as nvarchar(20)); END CATCH;
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想打印出来,这里有一个更简单的版本:BEGIN TRY print 1/0; END TRY BEGIN CATCH print '行号:' + CAST(ERROR_LINE() as nvarchar(20)); 结束接球; (2认同)

Sol*_*zky 7

这个问题实际上是在 2.5 年前在 StackOverflow 上提出的,我在那里发布了一个答案:

动态创建的存储过程的注释中的 SQL 打印行号?

该答案的相关部分复制如下:


您可以将TRY/CATCH与强制错误一起使用,因为CATCH块可以通过ERROR_LINE()函数返回发生错误的行号。为便于阅读而格式化的完整结构是:

DECLARE @Line INT = -1; -- default to an invalid line #

-- some code

BEGIN TRY
    ;THROW 50000, 'Line#', 1; -- all 3 values are arbitrary, but required
END TRY
BEGIN CATCH
    SET @LineNumber = ERROR_LINE();
END CATCH

-- some code
Run Code Online (Sandbox Code Playgroud)

现在,为了让@LineNumber变量填充它正在设置的行号,您可以将该构造简化为一行,如下所示:

BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
Run Code Online (Sandbox Code Playgroud)

请注意该THROW命令是在 SQL Server 2012 中启动的。如果您使用的是 SQL Server 2005、2008 或 2008 R2,那么您需要使用RAISERROR()function 而不是THROW