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始终是空的
完全不明白为什么写不进去

解决方案 »

  1.   

    --begin try
    -----
    --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
      

  2.   

    JX_TriggerLog本就是存在的记录错误信息的表了
    我的目的只是想在触发器出现错误后
    把相关的错误信息保存起来
    方便我日后查看和纠错
      

  3.   

    第一次用触发器
    也第一次用T-SQL
    触发器有点多 也不敢保证每个都工作正常 
    一个个调试又太麻烦 
    所以才想着数据操作过程中记录错误在线求解
      

  4.   

    如果该错误未在存储过程或触发器中出现,则返回 NULL。
    那就是没有错误,所以你插入的数据都为空!
      

  5.   


    我故意在触发器里设置一定会出现的错误来测试这个记录功能
    还调试进了触发器
    那几个临时变量都有值
    可insert操作就是无效 log表里啥都没有
      

  6.   

    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
     
    --你的语句能运行吗? 
      

  7.   

    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()
    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 )
      

  8.   

    呃 我在insert语句那里加了try catch
    得到的错误信息是
    "当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。"
    这个要怎么处理
      

  9.   

    DECLARE @name NVARCHAR(50),@msg NVARCHAR(200),@line INT把这个放在事务外边定义变量,里面直接用。
    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 )
      

  10.   

    问题解决了 BEGIN CATCH
    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的话 最好去掉 让错误往上一级抛出,由上一级做处理