使用RAISERROR终止SQL语句

时间:2009-08-06 14:34:23

标签: sql sql-server-2005 triggers raiserror

(SQL 2005) 是否有可能使用raiserror终止存储过程。

例如,在一个大型系统中,我们有一个不希望输入特定列的值。在更新触发器中,如果您写:

如果存在(select * from inserted其中testcol = 7) 开始    raiseerror('我的自定义错误',16,1) 端

仍然会应用更新信息。 但是,如果你运行

如果存在(select * from inserted其中testcol = 7) 开始    选择1/0 端

抛出除以0错误,实际上终止更新。 有什么方法可以用raiseerror做到这一点,所以我可以得到自定义错误消息?

4 个答案:

答案 0 :(得分:6)

在触发器中,发出ROLLBACK,RAISERROR然后返回。

请参阅Error Handling in SQL Server - Trigger Context by Erland Sommarskog

答案 1 :(得分:1)

您是否可以只在列中添加 CHECK 约束以防止它首先插入?

ALTER TABLE YourTable ADD CONSTRAINT CK_No_Nasties
    CHECK (testcol <> 7)

或者,您可以在插入sproc中启动一个事务(如果有的话)并在发生错误时将其回滚。这可以通过SQL Server 2005中的 TRY CATCH 来实现,并避免使用触发器。

答案 2 :(得分:1)

Begin try
@temp number
@temp=1/0
End try
Begin catch
@errormsg varchar(100)
@errormsg=error_massage()
Raiseerror(@errormsg,16,1)
End catch

答案 3 :(得分:0)

您应该在执行更新之前检查有效数据。

IF (@testvalue = 7)
    RAISERROR("Invalid value.", 16, 1);
ELSE
    UPDATE...