SQL 运行时异常
SQL runtime exceptions
我正在尝试一些交易,我有以下代码:
BEGIN TRANSACTION
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
COMMIT
首先,我在第一个插入语句中尝试在 table(char 到 bool)中插入无效类型的数据,并抛出运行时异常,第一个语句之后的其他语句也被忽略。
但是当我放入第一个插入语句以尝试在 ID 列中插入一个数字并且由于 IDENTITY_INSERT
设置为 OFF 而抛出错误时,执行了之后的其他语句(包括 COMMIT)并进行了更改保存到数据库。
我的问题是为什么第一个错误阻止了一切执行而第二个错误却没有?我怎么知道运行时错误是否会阻止其余代码的执行?我以为每个运行时异常都会停止执行...
编辑:
第一种情况(执行停止时):
`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)
系统在编译批处理时会产生一些错误。因为这些错误阻止了批处理的编译,所以返回了错误并且没有进一步的操作发生。
系统在执行编译的批处理时会产生其他错误。这些错误可能会终止单个语句的执行,但会允许继续执行下一条语句1.
有些错误可能在编译时或执行时产生,所以不只有"Errors that will happen during compilation"和"Errors that will happen during compilation"两个列表。例如,关于将 varchar
转换为 bit
的第一个错误。在这种情况下,它显然发生在编译时,因此可能是您查询中的 varchar
文字。但是,如果 varchar
值来自另一个 table,那将是一个执行时间错误。
1 一些 错误将中止批处理。在任何地方都没有明确记录哪些会,对于某些人来说,它取决于生效的 XACT_ABORT 设置。我想它不像我记忆中的那样清晰。
我正在尝试一些交易,我有以下代码:
BEGIN TRANSACTION
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
INSERT ROW INTO TABLE1
COMMIT
首先,我在第一个插入语句中尝试在 table(char 到 bool)中插入无效类型的数据,并抛出运行时异常,第一个语句之后的其他语句也被忽略。
但是当我放入第一个插入语句以尝试在 ID 列中插入一个数字并且由于 IDENTITY_INSERT
设置为 OFF 而抛出错误时,执行了之后的其他语句(包括 COMMIT)并进行了更改保存到数据库。
我的问题是为什么第一个错误阻止了一切执行而第二个错误却没有?我怎么知道运行时错误是否会阻止其余代码的执行?我以为每个运行时异常都会停止执行...
编辑:
第一种情况(执行停止时):
`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)
系统在编译批处理时会产生一些错误。因为这些错误阻止了批处理的编译,所以返回了错误并且没有进一步的操作发生。
系统在执行编译的批处理时会产生其他错误。这些错误可能会终止单个语句的执行,但会允许继续执行下一条语句1.
有些错误可能在编译时或执行时产生,所以不只有"Errors that will happen during compilation"和"Errors that will happen during compilation"两个列表。例如,关于将 varchar
转换为 bit
的第一个错误。在这种情况下,它显然发生在编译时,因此可能是您查询中的 varchar
文字。但是,如果 varchar
值来自另一个 table,那将是一个执行时间错误。
1 一些 错误将中止批处理。在任何地方都没有明确记录哪些会,对于某些人来说,它取决于生效的 XACT_ABORT 设置。我想它不像我记忆中的那样清晰。