数据是通过电子表格提供给我的,我正在转换为管道分隔文件。我尝试插入超过46000行但其中四(4)行失败并显示错误消息
SQLState = 22001,NativeError = 0 错误= [Microsoft] [SQL Native Client]字符串数据,右截断
知道哪些行失败会很好。有没有办法可以强制这些行插入截断的字符串,或者确定哪些行失败了BCP?
bcp TableName in MyCreatedCSVFile.csv -T -c -t^|
< - 将它们导入表中 - 我不得不逃避|使用^。有更好的方法吗?
答案 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”。
这有多大帮助。