4

(SQL 2005) raiserror 是否可以终止存储过程。

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

如果存在 (select * from inserted where testcol = 7) begin raiseerror('My Custom Error', 16, 1) end

更新信息仍然适用。但是如果你跑

如果存在(从插入的地方选择 * testcol = 7)开始选择 1/0 结束

抛出一个除以 0 的错误,实际上终止了更新。有什么办法可以通过 raiseerror 来做到这一点,以便我可以返回自定义错误消息?

4

4 回答 4

6

在触发器中,发出 ROLLBACK、RAISERROR 和 RETURN。

请参阅SQL Server 中的错误处理 - Erland Sommarskog 的触发上下文

于 2009-08-06T14:47:25.460 回答
1

你能不能只在列中添加一个CHECK约束来防止它首先被插入?

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

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

于 2009-08-06T14:40:19.187 回答
1
Begin try
@temp number
@temp=1/0
End try
Begin catch
@errormsg varchar(100)
@errormsg=error_massage()
Raiseerror(@errormsg,16,1)
End catch
于 2011-11-09T10:58:35.413 回答
0

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

IF (@testvalue = 7)
    RAISERROR("Invalid value.", 16, 1);
ELSE
    UPDATE...
于 2009-08-06T14:38:54.163 回答