DECLARE @Error int;
INSERT INTO Person.BusinessEntityContact
(BusinessEntityID
,PersonID
,ContactTypeID)
VALUES
(0,0,1);
SELECT @Error = @@ERROR;
PRINT ‘The Value of @Error is ‘ + CONVERT(varchar, @Error);
我有 :
消息 547,级别 16,状态 0,第 4 行 INSERT 语句与 FOREIGN KEY 约束“FK_BusinessEntityContact_Person_PersonID”冲突......该语句已终止。@Error 的值为 547
这意味着在抛出错误后该过程仍在继续。
但是,如果我尝试创建一个表(运行下面的脚本两次以触发错误)为:
CREATE TABLE OurIFTest(
Col1 int PRIMARY KEY
);
IF @@ERROR != 0
PRINT 'Problems!';
ELSE
PRINT 'Everything went OK!';
然后我得到了
消息 2714,级别 16,状态 6,第 2 行数据库中已经有一个名为“OurIFTest”的对象。
这意味着在抛出错误时进程终止。
那么为什么进程因“创建”而不是“插入”而终止?
您可以使用 SET XACT_ABORT 强制执行相同的错误行为
从文档中:
资源
默认情况下
XACT_ABORT = OFF
,这意味着不同的错误会产生不同的结果。要强制错误行为相同,
SET XACT_ABORT ON;
请在脚本开头添加。用你的例子测试
显示唯一的错误:
另请注意有关错误处理和
SET XACT_ABORT
资源