1

我制作了一个程序来在一个表(主表)上执行插入/删除...我的程序还为另一个表(审计日志表)中的这个表上执行的操作(插入/删除)写了一个日志......程序为在审计日志表中的主表上执行的每个成功或失败操作写入日志...我的审计日志表中有一个字段,我想在其中移动操作失败的原因,如果操作将失败主桌..

我知道像 -503 , +100 , -803 这样的 sqlcode 的原因......但是我想为每个可能的 SQL 代码插入原因......

T-SQL 中是否有任何变量,我可以从中将 sql 错误文本消息插入表中..??或者还有其他方法可以做到吗?

4

3 回答 3

4

尝试这样的事情:

BEGIN TRY
    -- Do your work on main table
END TRY
BEGIN CATCH

    INSERT INTO LOG_TABLE
    SELECT ERROR_NUMBER(),
           ERROR_MESSAGE()
END CATCH

这假设 LOG_TABLE 只有两列,第一列是错误号,第二列是错误消息。您可以使用以下功能:

ERROR_LINE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) 
于 2012-05-09T15:42:10.367 回答
0

是的,您可以这样做,但有一些复杂性和限制。这不是建议,只是一个答案。

SQLServer 提供了内置函数,例如 ERROR_MESSAGE()、ERROR_NUMBER() 以在 catch 块中使用。

如果您的插入/删除代码在自动提交模式下运行(没有开始传输,没有隐式事务),那么只需在 catch 块中记录错误消息和编号就可以了,因为插入和删除已经回滚或提交。

所以

begin try
    -- do work
end try
begin catch
    insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch

能行得通。

如果您的 TSQL 代码或客户端使用 begin tran 或隐式事务,catch 块中的逻辑必须考虑这一点,否则回滚原始事务时将回滚错误记录,不留下任何错误记录。

如果你有这样的...

begin try
    begin tran
    -- do work
    if xact_state() = 1 commit tran
    if xact_state() = -1 rollback tran
end try
begin catch
    -- Now there is a good chance a transaction is still pending or uncomittable.
    if xact_state() != 0 rollback tran -- assuming you always rollback.
    -- Insert will be recorded because previous transaction was cleared.
    insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch

如果您在 catch 块中不提交或回滚,并且您的事务是不可提交的,那么您的插入最终会回滚,并且您没有错误记录。

如果客户端正在管理事务,则可能无法记录错误信息,除非客户端对您的错误处理程序发出回滚没有问题。并且发出回滚本身可能会产生掩盖真正根本原因的错误。如果不考虑复杂性,如果客户端正在管理事务,那么让客户端也可以更容易地捕获和记录错误。

于 2012-05-09T16:42:00.193 回答
-1

--检查是否有错误然后----

  BEGIN  
         RAISERROR('something is wrong',16,2)  
         RETURN -20008  ---specify
    END

根据返回的号码处理

于 2012-05-09T15:58:25.047 回答