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)
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)
这个问题实际上是在 2.5 年前在 StackOverflow 上提出的,我在那里发布了一个答案:
该答案的相关部分复制如下:
您可以将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。
| 归档时间: |
|
| 查看次数: |
14285 次 |
| 最近记录: |