如何编写一个t-sql master程序来捕获子程序引发的错误

时间:2015-07-28 18:34:20

标签: sql-server tsql stored-procedures

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

1 个答案:

答案 0 :(得分:2)

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

COMMIT TRANSACTION使自事务开始以来执行的所有数据修改成为数据库的永久部分,释放事务持有的资源,并递减@@TRANCOUNT to 0。如果@@TRANCOUNT is greater than 1COMMIT 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