我在TRY块中有一个“插入#tmp Select * from TransTable”语句。此语句会生成错误,因为#tmp具有标识列。但是在引发错误之后,控制不会转到CATCH块。引发的错误的严重性为16,因此根据我的理解,它应该转到CATCH块。请解释为什么会发生这种情况。
让我详细说明这个问题,下面是我们要将记录从一个表转储到另一个表的情况,但由于Identity(未打开),它会在执行时抛出错误。这里的期望是,它应该去抓住哪里,因为它没有任何想法?
创建表TableA ( ID int身份, 值varchar(1) ) 创建表TableB ( ID int身份, 值varchar(1) )
插入TableA值('A') 插入TableA值('B') 插入TableA值('C') 插入TableA值('D') 插入TableA值('E')
开始尝试
截断表TableB
插入表B从TableA中选择*
结束尝试
开始捕获
选择
ERROR_NUMBER()AS ErrorNumber,
ERROR_SEVERITY()AS ErrorSeverity,
ERROR_STATE()为ErrorState,
ERROR_PROCEDURE()为ErrorProcedure,
ERROR_LINE()为ErrorLine,
ERROR_MESSAGE()为ErrorMessage;
结束捕获
错误: Msg 8101,Level 16,State 1,Line 26 只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'TableB'中标识列的显式值。
答案 0 :(得分:1)
如果我没有误会,当您使用SQL调用时,您需要“捕获”SQL异常,这与常规异常不同。
您使用的是哪种编程语言?你用的是什么数据库?你能发一个示例代码吗?
这是一个例子:
Try
' Execute insert statement
Catch sqlEx as SqlException
' Do something about the SQL exception
Catch ex as Exception
' Regular exception
End Try