我正在尝试处理事务,我有以下代码:
BEGIN TRANSACTION
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
COMMIT
首先,我将第一个insert语句设置为尝试在表中插入无效类型的数据(char to bool),并抛出运行时异常,并忽略第一个之后的其他语句。
但是当我把第一个insert语句试图在ID列中插入一个数字并因为IDENTITY_INSERT
设置为OFF而抛出错误时,执行了其他语句(包括COMMIT)并将更改保存到DB。
我的问题是为什么第一个错误会阻止所有内容执行而第二个错误没有?我怎么知道运行时错误是否会阻止执行其余代码?我以为每个运行时异常都会停止执行...
编辑:
第一种情况(执行停止时):
`Msg 245, Level 16, State 1, Line 6
Conversion failed when converting the varchar value 'a' to data type bit.`
第二种情况(继续执行时):
Msg 544, Level 16, State 1, Line 6
Cannot insert explicit value for identity column in table 'crmMappingRule' when IDENTITY_INSERT is set to OFF.
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
答案 0 :(得分:3)
系统编译批次时会产生一些错误。由于这些错误会阻止批处理编译,因此会返回错误,并且不会再执行任何操作。
当系统执行编译的批处理时,会生成其他错误。这些错误可能会终止单个语句的执行,但会允许执行进入下一个语句 1 。
在编译时或执行时可能会生成一些错误,因此不只有两个“编译期间将发生的错误”和“编译期间将发生的错误”的列表。例如,您有关将varchar
转换为bit
的第一个错误。在这种情况下,它显然发生在编译时,因此在查询中可能是varchar
个字面值。但是,如果varchar
值来自另一个表,则可能是执行时错误。
1 一些错误将中止批处理。它没有明确记录哪些会,哪些取决于有效的XACT_ABORT设置。我想这并不像我记得的那样清晰。