SQL运行时异常

亚历克斯

我正在尝试进行事务处理,并且有以下代码:

BEGIN TRANSACTION
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
COMMIT

首先,我放置了第一个insert语句以尝试在表中插入无效类型的数据(从char到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)
Damien_The_Unbeliever

系统在编译批处理时会生成一些错误由于这些错误阻止了批处理的编译,因此将返回错误,并且不会进行进一步的操作。

系统执行编译的批处理时会生成其他错误这些错误可能会终止单个语句的执行,但将允许执行继续执行下一条语句1

在编译时或执行时可能会生成一些错误,因此不仅只有两个列表:“编译期间将发生的错误”和“编译期间将发生的错误”。例如,你的第一个错误就转换varcharbit在这种情况下,它显然是在编译时发生的,因此varchar查询中文字可能也是如此但是,如果该varchar值来自另一个表,则可能是执行时间错误。


1 一些错误将中止该批处理。没有清楚的记录在哪里,哪些取决于有效的XACT_ABORT设置。我想这还不如我所记得。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章