【发布时间】:2015-05-28 11:10:14
【问题描述】:
我在 TRY 块中有一个“插入 #tmp Select * from TransTable”语句。此语句生成错误,因为 #tmp 具有标识列。但是在引发错误后,控制不会转到 CATCH 块。引发的错误的严重性为 16,因此根据我的理解,它应该进入 CATCH 块。请解释为什么会发生这种情况。
让我详细说明问题,下面是我们要将记录从一个表转储到另一个表但由于身份(未打开)而在执行时引发错误的场景。这里的期望是,它应该去 catch 块,因为它没有任何想法?
创建表TableA ( ID int 身份, 值 varchar(1) ) 创建表 TableB ( ID int 身份, 值 varchar(1) )
插入 TableA 值 ('A') 插入 TableA 值('B') 插入 TableA 值('C') 插入 TableA 值('D') 插入 TableA 值('E')
开始尝试
截断表 TableB
插入表 B 从表 A 中选择 *
结束尝试
开始捕捉
选择
ERROR_NUMBER() 作为错误编号,
ERROR_SEVERITY() 作为错误严重性,
ERROR_STATE() 作为错误状态,
ERROR_PROCEDURE() 作为 ErrorProcedure,
ERROR_LINE() 作为错误线,
ERROR_MESSAGE() 作为错误消息;
结束捕获
错误: 消息 8101,第 16 级,状态 1,第 26 行 只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“TableB”中的标识列指定显式值。
【问题讨论】:
标签: try-catch