【问题标题】:how to write a t-sql master procedure to catch sub procedures raised error如何编写一个 t-sql 主程序来捕获子程序引发的错误
【发布时间】:2015-07-28 18:34:19
【问题描述】:

我是 T-SQL 编程的新手。我需要编写一个包含 5 个不同子程序的主程序。我如何构建程序以使子程序不会中止。相反,它们将捕获错误并在输出参数中将它们报告回主程序。如果可以的话,请给我提供伪代码。谢谢。

【问题讨论】:

标签: sql-server tsql stored-procedures


【解决方案1】:

类似BEGIN TRANSACTION 表示连接引用的数据在逻辑和物理上一致的点。

COMMIT TRANSACTION 使自事务开始以来执行的所有数据修改成为数据库的永久部分,释放事务持有的资源,并减少 @@TRANCOUNT to 0。如果@@TRANCOUNT is greater than 1、COMMIT TRANSACTION 递减@@TRANCOUNT only by 1 并且事务保持活动状态。

ROLLBACK TRANSACTION 删除从事务开始或保存点所做的所有数据修改。它还释放事务持有的资源。

ERROR_NUMBER() 返回错误的编号。

ERROR_SEVERITY() 返回严重性。

ERROR_STATE() 返回错误状态编号。

ERROR_PROCEDURE() 返回发生错误的存储过程或触发器的名称。

ERROR_LINE() 返回导致错误的例程中的行号。

ERROR_MESSAGE() 返回错误消息的完整文本。文本包括为任何可替代参数提供的值,例如长度、对象名称或时间。

-- try block will start
        BEGIN TRY

          BEGIN TRANSACTION TranName
            EXECUTE usp_First;
        -- if sub procedure have some parameter then we can pass 
            EXECUTE usp_Second param1, param2;
            .
            .
            EXECUTE usp_Fifth;
         COMMIT TRANSACTION TranName

        END TRY
        -- if soemthing goes wrong then catch
        BEGIN CATCH 
          IF (@@TRANCOUNT > 0)
           BEGIN
              ROLLBACK TRANSACTION TranName
           END 
           -- get error detail
            SELECT
                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

更多信息https://msdn.microsoft.com/en-IN/library/ms175976.aspx

【讨论】:

  • 这是正确的答案,但是当 SP 服务器是链接服务器并且我们想要在其上执行 SP 时,它无法将引发的错误数据发送给调用它的父 SP。 !!!我该怎么办?\
  • @BehzadKhosravifar OP 问题对于我们可以使用的链接服务器来说是正常的sp_testlinkedserver
  • sp_testlinkedserver SP 作业只是测试与服务器的连接!!!我的问题是:在链接服务器中,您无法捕获其他服务器错误。
  • @tinka sp_testlinkedserver 测试连接并且没有任何错误处理!
  • 您可以访问子程序吗?我的意思是你可以编辑它们吗?你可以在没有副作用的情况下更改输入和输出参数吗?
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2017-08-02
  • 2011-08-15
  • 2011-07-24
  • 2014-05-03
相关资源
最近更新 更多