【问题标题】:Is there a way to force truncated columns to be inserted into a SQL Server table?有没有办法强制将截断的列插入到 SQL Server 表中?
【发布时间】:2011-08-13 06:12:55
【问题描述】:

数据以电子表格的形式提供给我,我将其转换为以竖线分隔的文件。我尝试插入超过 46000 行,但其中四 (4) 行失败并显示错误消息

SQLState = 22001,NativeError = 0 错误 = [Microsoft][SQL Native Client]字符串数据,右截断

很高兴知道哪些行失败。有没有一种方法可以强制将这些行插入截断的字符串,或者确定哪些行因 BCP 失败?

  1. 我已经尝试构建 在 XLSX 文件中插入语句 与连接。那失败了,因为 我有太多的参数 连接。
  2. 我试过逗号和 制表符分隔的文件,失败 因为有些数据有那些 字符。
  3. 我终于构造了管道分隔 修改后的文件 本地化设置,所以我可以做 使用 Excel (How to save an Excel spreadsheet as pipe-delimited),然后使用 bcp TableName in MyCreatedCSVFile.csv -T -c -t^| 将它们导入表中

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: sql-server-2005 bcp


    【解决方案1】:

    您使用的是临时表吗?

    您通常会使用具有较大列长度等的列,然后执行验证和质量检查。即使是简单的

    INSERT Finaltable (..)
    SELECT (..), LEFT (offendingcolumn, 100) FROM Stagingtable
    

    存储过程也可用于执行 BULK INSERT,然后进行一些检查,然后将 INSERT 插入到最终表中。

    【讨论】:

      【解决方案2】:

      您可以将错误数量设置得足够高以覆盖异常,然后指定错误文件。然后,您一次处理一个异常。这是最干净的方法。如果您愿意使用 SSIS,您可以在您的工作流程中获得更详细的信息并处理截断和可能的日志记录,但您会失去批量复制的好处。

      【讨论】:

        【解决方案3】:

        我设法通过创建“代替”触发器来做到这一点。

        我用 varchar(max) 创建了一个表,以确保我没有截断。 然后我在插入上创建了一个代替触发器(所以这个“代理”表永远不会得到行)。

        在触发器中我做了一个转换(varchar(50),name255)。 即:明确地进行截断。

        但是,这意味着您需要在 BCP 命令中指定“FIRE_TRIGGER”。

        这有什么帮助。

        【讨论】:

          猜你喜欢
          • 2019-08-30
          • 2015-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          • 2022-06-28
          • 1970-01-01
          • 2014-01-15
          相关资源
          最近更新 更多