【问题标题】:Insert into #tmp select * from transTable error not going into catch block插入#tmp select * from transTable 错误未进入 catch 块
【发布时间】: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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多