我创建了一个程序来对表(主表)执行插入/删除...我的程序还在另一个表(审计日志表)中为此表执行的操作(插入/删除)的日志写入。 .. 程序为审计日志表中主表上执行的每个成功或失败操作写入日志...我的审计日志表中有一个字段,我想移动操作失败的原因,如果操作失败主表..
我知道sqlcodes的原因如-503,+ 100,-803 ......但我想为每个SQL代码插入原因...
T-SQL中是否有任何变量,我可以从中将sql错误文本消息插入表中。 或者还有其他方法可以做到吗?
答案 0 :(得分: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)
答案 1 :(得分:0)
是的,你可以做到这一点,有一些复杂性和局限性。这不是一个推荐,只是一个答案。
SQLServer提供内置函数,例如ERROR_MESSAGE(),ERROR_NUMBER(),以便在catch块中使用。
如果插入/删除代码在自动命令模式下运行(没有begin tran,没有隐式事务),那么只需在catch块中记录错误消息和数字就可以了,因为插入和删除已经回滚或提交。 / p>
所以
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块中提交或回滚,并且您的事务是不可注销的,那么您的插入最终会回滚,并且您没有错误记录。
如果客户端正在管理事务,则可能无法记录错误信息,除非客户端发出回滚的错误处理程序没有问题。发出回滚本身可能会产生一个掩盖真正根本原因的错误。如果客户端没有处理复杂性,如果客户端正在管理事务,那么让客户端捕获并记录错误也会容易得多。
答案 2 :(得分:-1)
- 检查是否存在错误----
BEGIN
RAISERROR('something is wrong',16,2)
RETURN -20008 ---specify
END
根据退货编号
处理