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

标签 sql-server tsql dynamic-sql line-numbers

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

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

例如,如果 @@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/

相关文章:

sql - 总问题的两倍

sql-server - 如何查询集成服务目录

sql - 为什么备份 sql server 查询在没有变量的情况下不起作用?

mysql - CLR 汇编 C# DBMS

sql-server - 确定 SQL Server 数据库大小

sql - 将 SQL 计数结果与之前的结果值进行比较 - 自上次选择以来有多少新记录计数

mysql - 我怎样才能优化他的sql查询

TSQL -- 将日期插入动态 SQL

sybase - 动态生成的数据窗口中的列名称

sql - 使用查询结果设置下一个查询的表