【问题标题】:how to catch the specific ID which causes error in a bulk insert如何捕获导致批量插入错误的特定 ID
【发布时间】:2019-11-13 17:58:00
【问题描述】:

我有一个带有 INSERT 语句的代码块,其中应用了许多逻辑,几分钟后它由于任何其他插入错误(如“截断错误”等)而失败。因此插入失败并引发错误,正如我在 catch 块中提到的那样,但我需要知道哪个特定 ID 导致了该错误。有可能得到那个ID吗? 下面是我的示例代码块

BEGIN TRY
    BEGIN TRAN
        INSERT INTO MyTable (fieldA, fieldB,.....)
        SELECT (fieldA, fieldB,.....)
        FROM <many joins from other tables>

    COMMIT TRAN

END TRY 

BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE()
    IF @@TRANCOUNT > 0
            ROLLBACK
END CATCH

如果插入失败,我们可以在 CATCH 块中获取 fieldA 值以及 ERROR_NUMBER()、ERROR_MESSAGE() 吗?

或者有没有其他方法可以查看导致错误的特定 fieldA 值? 任何建议将不胜感激。

【问题讨论】:

  • 在插入过程中,您的某些数据似乎被截断了。向我们展示一些示例数据以及可能的真实查询对您有所帮助,以便我们更好地了解这里发生的情况。
  • 你可以在你的insert语句之前使用相同的select语句并将fieldA赋值给一个变量,然后你可以在catch块中选择变量的值
  • @ShikharArora 这是不可能的,因为他没有遍历数据,他正在从其他表中获取数据并将其作为批量插入新表中。
  • SQL Server 没有提供任何方法来做这个,需要提前清理源表中的数据-检测无效值。
  • @Mar1009 首先,您需要找到长度大于目标列的列。然后您可以对其进行查询以找到具有较大文本的列。 select * from table where len(col1) &gt; 20。这样您就可以找到包含无效文本的行。

标签: sql-server tsql sql-server-2008-r2 try-catch


【解决方案1】:

这样的事情可能会起作用:

DECLARE @ids TABLE (id bigint)
BEGIN TRY
BEGIN TRAN
    DECLARE @ids TABLE (id bigint)
    INSERT INTO b.tbl
    OUTPUT Inserted.ID INTO @ids(id)
    select       f1,f2,f3 from b.tbl
    COMMIT TRAN
END TRY 

BEGIN CATCH
    select * from @ids
    SELECT ERROR_NUMBER(), ERROR_MESSAGE()
    IF @@TRANCOUNT > 0
            ROLLBACK
END CATCH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2021-07-17
    • 2017-08-23
    • 1970-01-01
    • 2012-08-09
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多