【问题标题】:Can you capture the bad t-sql in error message你能在错误信息中捕获坏的 t-sql
【发布时间】:2015-09-28 06:17:21
【问题描述】:

如果我运行如下 sql 语句:

SELECT 1/0;

有没有办法捕获语句“SELECT 1/0;”在错误消息中?以下没有给我失败的SQL:

开始尝试 选择 1/0; 结束尝试 开始捕捉 选择 ERROR_NUMBER() 作为错误编号, ERROR_SEVERITY() 作为错误严重性, ERROR_STATE() 作为错误状态, ERROR_PROCEDURE() 作为错误程序, ERROR_LINE() 作为错误线, ERROR_MESSAGE() 作为错误消息; 结束捕获; 去吧

另外,我想看看是否可以避免在每个语句中使用 try catch。我有一个在 TRY 和 CATCH 语句之间执行大量 SQL 语句的 SP。我想知道 TRY ... CATCH 块中众多 SQL 语句中哪一条 SQL 语句失败了。

到目前为止,我发现的只是给出错误消息的详细信息,而不是失败的 T-SQL。

【问题讨论】:

    标签: sql-server tsql error-handling


    【解决方案1】:

    您可以利用表变量不会回滚的事实。 在每个语句之后,将成功行插入表变量以进行日志记录。

    如果 proc 成功,则不需要从 table 变量返回任何内容。如果它遇到了 catch 块,您可以回滚事务并从表变量中重新运行选择,或者更好地将该信息插入到日志表中。如果您的 proc 设置了很多变量,我还会在此表中记录这些值,以便您可以查看 proc 失败时的值。通过将其放入日志表中,您可以记录 proc 失败的所有时间,因此,如果它在周五晚上失败并且失败多次但不是在周末每次都失败,那么您将获得关于哪些工作有效以及哪些变量的数据是在失败的时候用来弄清楚发生了什么。如果您使用动态 sql,这尤其有用,因为您也可以记录生成的 sql 语句。

    【讨论】:

    • 好的。谢谢。要去试试。如果有一个类似于 ERROR_MESSAGE、ERROR_LINE 等的 ERROR_SQL 选项,那就太好了。
    【解决方案2】:

    如果您的存储过程有一堆语句,最好在存储过程的开头设置一个日志变量。您可以调整此变量的值,以确保您是否想要记录步骤。在您当前的情况下,您可以将其设置为 1 并开始记录所有/必要的步骤。这将帮助您找出执行了什么以及错误发生在哪里。

    例如:DECLARE @bLog BIT = 0 -- 不想记录时的默认值

    SET @bLog = 1 如果(@bLog = 1) 开始 ----- 在此处添加日志,备份之前步骤执行的结果 --etc。 结束

    【讨论】:

      【解决方案3】:

      你可以使用相同的行号,但是如果你想检查哪个语句有问题,那么你必须定义语句号来检查数字并在这样的变量中设置相同的数字。

      Declare @StmNo as int
      BEGIN TRY
          set @StmNo=1
          SELECT GETDATE();
          set @StmNo=2
          SELECT 1/0;
      END TRY 
      BEGIN CATCH 
              SELECT 
                  @StmNo AS StatementNumber,
                  ERROR_NUMBER() AS ErrorNumber, 
                  ERROR_SEVERITY() AS ErrorSeverity,
                  ERROR_STATE() AS ErrorState, 
                  ERROR_PROCEDURE() AS ErrorProcedure, 
                  ERROR_LINE() AS ErrorLine, 
                  ERROR_MESSAGE() AS ErrorMessage; 
              END CATCH; 
              GO 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-16
        • 2010-10-31
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        相关资源
        最近更新 更多