begin try
---
end trybegin catch
DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
end catch这里insert死活无效的 JX_TriggerLog始终是空的
完全不明白为什么写不进去
---
end trybegin catch
DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
end catch这里insert死活无效的 JX_TriggerLog始终是空的
完全不明白为什么写不进去
-----
--end try
--
--begin catch
create table JX_TriggerLog
(TriggerName NVARCHAR(50),TriggerMsg NVARCHAR(200),TriggerLine INT)DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
SET @name = @@ERROR
SET @line = @@ERROR
SET @msg = @@ERROR
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
--end catch
select * from JX_TriggerLog
drop table JX_TriggerLog
我的目的只是想在触发器出现错误后
把相关的错误信息保存起来
方便我日后查看和纠错
也第一次用T-SQL
触发器有点多 也不敢保证每个都工作正常
一个个调试又太麻烦
所以才想着数据操作过程中记录错误在线求解
那就是没有错误,所以你插入的数据都为空!
我故意在触发器里设置一定会出现的错误来测试这个记录功能
还调试进了触发器
那几个临时变量都有值
可insert操作就是无效 log表里啥都没有
---
end trybegin catch
DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
end catch
--你的语句能运行吗?
---
end trybegin catch
DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
end catch
if(@name is not null or @line is not null or @msg is not null)
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
得到的错误信息是
"当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。"
这个要怎么处理
DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT
---
begin try
---
end trybegin catch
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
end catch
if(@name is not null or @line is not null or @msg is not null)
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
SET @name = ERROR_PROCEDURE()
SET @line = ERROR_LINE()
SET @msg = ERROR_MESSAGE()
ROLLBACK --加了这个操作就OK了
BEGIN TRY
INSERT INTO dbo.JX_TriggerLog (
TriggerName,
TriggerMsg,
TriggerLine
) VALUES (
@name,
@msg,
@line )
END TRY
BEGIN CATCH
DECLARE @err NVARCHAR(50)
SET @err = ERROR_MESSAGE()
END CATCH
END CATCH
看到个解释是这么说
sqlserver存储过程报错:当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。出现这个错误
代表是存储过程(或者调用的子存储过程)中含有try catch语句,并且将设置了SET XACT_ABORT ON;
SET XACT_ABORT ON代表的意思是 程序如果遇到错误就回滚。
如果在程序中没有try catch的情况下 就直接回滚了。但是如果有try catch的话,在try块中出现了错误,被catch捕获以后。Xact_state()就会变成-1 (Xact_state()是一个系统函数 0表示没有活动事务,1表示有活动事务并且可以提交,-1表示有活动事务,但是无法提交换句话说就是只能rollback)
所以在你提交的时候就会报错“当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。”
解决:1 在catch中对Xact_state()的值进行判断如果为-1的话 直接rollback
2 如果在子存储过程中存在try catch的话 最好去掉 让错误往上一级抛出,由上一级做处理