gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:44:15 25 4
gpt4 key购买 nike

我编写了一个长达数千行的脚本,用于动态生成一些存储过程。

我想在存储过程的注释中引用生成存储过程的脚本,并且希望能够通过将脚本文件的行号插入到注释中来引用脚本文件中的行存储过程文件。

例如,如果 @@line_number 在下面的代码中给出了我想要的行号,那么 @@line_number 应该是 5

1| declare @job varchar(max)
2| SET @job = '/* this is generated dynamicly by _______ */'
3| SET @job = @job + 'SELECT *' + CHAR(10)
4| SET @job = @job + 'FROM ' + @Table_Name + CHAR(10)
5| SET @job = @job + '/* ' + @@line_number + ' */'

最佳答案

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

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

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

BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH

这是它工作的完整示例:

SET ANSI_NULLS ON
SET NOCOUNT ON
GO
-- Line #1 (of current batch, not of the entire script if GOs are used)

DECLARE @CRLF NCHAR(2) = NCHAR(13) + NCHAR(10),
@SQL1 NVARCHAR(MAX) = '',
@SQL2 NVARCHAR(MAX) = '', -- Line #5
@Line INT = -1 -- default to an invalid line #

SET @SQL1 += N'/********************' + @CRLF
SET @SQL1 += N' *' + @CRLF
SET @SQL1 += N' * Test Auto-' + @CRLF -- Line #10
SET @SQL1 += N' * Generated Proc 1' + @CRLF
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
SET @SQL1 += N' * Line #:' + CONVERT(NVARCHAR(10), @Line) + @CRLF
SET @SQL1 += N' *' + @CRLF
SET @SQL1 += N' ********************/' + @CRLF -- Line #15

-- more code here

SET @SQL2 += N'/********************' + @CRLF
SET @SQL2 += N' *' + @CRLF -- Line #20
SET @SQL2 += N' * Test Auto-' + @CRLF
SET @SQL2 += N' * Generated Proc 2' + @CRLF
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
SET @SQL2 += N' * Line #:' + CONVERT(NVARCHAR(10), @Line) + @CRLF
SET @SQL2 += N' *' + @CRLF -- Line #25
SET @SQL2 += N' ********************/' + @CRLF

PRINT @SQL1
PRINT @SQL2
GO

Proc 1 和 Proc 2 返回的行号分别是 12 和 23,这对两者都是正确的。

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

关于sql-server - SQL在动态创建的存储过程的注释中打印行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com