(SQL 2005) 是否有可能使用raiserror终止存储过程。
例如,在一个大型系统中,我们有一个不希望输入特定列的值。在更新触发器中,如果您写:
如果存在(select * from inserted其中testcol = 7) 开始 raiseerror('我的自定义错误',16,1) 端
仍然会应用更新信息。 但是,如果你运行
如果存在(select * from inserted其中testcol = 7) 开始 选择1/0 端
抛出除以0错误,实际上终止更新。 有什么方法可以用raiseerror做到这一点,所以我可以得到自定义错误消息?
答案 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...