有没有办法强制截断列插入SQL Server表?

时间:2011-04-26 17:55:17

标签: sql-server-2005 bcp

数据是通过电子表格提供给我的,我正在转换为管道分隔文件。我尝试插入超过46000行但其中四(4)行失败并显示错误消息

  

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

知道哪些行失败会很好。有没有办法可以强制这些行插入截断的字符串,或者确定哪些行失败了BCP?

  1. 我试过构建了 在XLSX文件中插入语句 与CONCATENATE。那失败是因为 我的参数太多了 CONCANTENATE。
  2. 我试过逗号和 制表符分隔的文件,失败 因为有些数据有这些 字符。
  3. 我最终构造了管道分隔 更改后的文件 本地化设置,所以我可以做 这用Excel(How to save an Excel spreadsheet as pipe-delimited),然后用bcp TableName in MyCreatedCSVFile.csv -T -c -t^| < - 将它们导入表中 - 我不得不逃避|使用^。
  4. 命令行上的字符

    有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您使用的是临时表吗?

您通常使用具有大量色谱柱等的那些,然后执行验证和质量检查。即使是简单的

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我设法通过创建“而不是”触发器来完成此操作。

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

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

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

这有多大帮助。