2011-04-26 71 views
1

将数据发送给我,转换为管道分隔文件。我试图插入超过46000行,但四(4)的这些失败,该错误消息是否有强制将截断列插入SQL Server表的方法?

SQLSTATE = 22001,NativeError = 0 错误= [微软] [SQL本机客户端]字符串数据,右截断

这将是很高兴知道哪些行失败。有没有办法强制这些行插入截断的字符串,或确定哪些与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^| <后 - 我不得不逃离|字符与命令行中的^。

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

回答

1

您在使用临时表吗?

你通常使用一个慷慨的列长度等,然后进行验证和质量检查。即使是一个简单的

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

一个存储过程也可以用来做一个大量插入,然后一些检查,然后插入到最终表中。

+0

太棒了。谢谢。 – Blanthor 2011-04-26 18:47:05

0

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

0

我设法通过创建一个“而不是”触发器来做到这一点。

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

在触发我做了转换(VARCHAR(50),name255)。 即:明确地进行截断。

然而,这意味着你需要指定“FIRE_TRIGGER”与您的BCP命令。

这是如何帮助。

相关问题