调用存储过程中的触发器中没有出现RaiseError

时间:2015-04-23 13:26:04

标签: sql-server errorlevel raiserror

我们有一个旧产品,从最初构建在SQL Server 2000中多年来一直缓慢向前发展,并且问题与SQL如何冒出RaiseError调用的错误有关。

例如,我在表上有一个触发器,引发类似于此的错误:

ALTER TRIGGER [dbo].[Rotation_UTrig]
ON [dbo].[Rotation] FOR UPDATE AS
BEGIN
    SET NOCOUNT ON
.
.
.
    /* * VALIDATION RULE FOR FIELD 'RotationYear' */
            RAISERROR ('Invalid value entered for RotationYear, must be >=0', 44444, 1)
            goto fatalerror
.
.
fatalerror:
END

这在调用过程中具有if语句具有@@Error值的所需效果:

 update Rotation 
 set OrderedQuantity = @OrderedQuantity, 
     DespatchedQuantity = @DespatchedQuantity 
 where ID = @RotationNo

 if @@Error != 0
 begin
    if @AlreadyInTrans = 0 begin rollback transaction end
        raiserror ('Error on update of Rotation.', 16, 1)
        goto fatalerror
end
.
.
.
fatalerror:

但是父调用应用程序看到的错误是:

  

错误严重级别大于18只能由sysadmin角色的成员指定,使用WITH LOG选项

这是因为如果我添加

,触发器中的错误级别为44444
With LOG

Raiserror的触发器代码然后关闭连接(我们不想要)。如果我在触发器中将错误级别降低到16,那么

if @@Error !=0

行没有被点击,因为@@Error被设置为零。

除了使用

Try... Catch

在父过程的update语句周围,是否有任何其他方法将@@Error值冒泡到执行更新的过程中以便执行过程代码(更新语句和以下if @@ Error != 0)可以保持不变吗?如果没有,那么这对我的应用程序来说是一个巨大的变化,因为我需要更改受影响的表正在更新的所有位置以及所有触发器。

1 个答案:

答案 0 :(得分:0)

发现它!问题是,当另一个触发器出现并且没有任何问题时,@@ Error将重置为0。