更新:最终使用了 Johnny Bubriski 创建的这个方法,然后对其进行了一些修改以跳过重复项。效果就像一个魅力,而且速度显然相当快。
关联:http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/ http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/
我一直在寻找这个问题的答案,但似乎找不到。我正在执行 T-SQL 批量插入,将数据从 csv 文件加载到本地数据库的表中。我的声明如下:
BULK INSERT Orders
FROM 'csvfile.csv'
WITH(FIELDTERMINATOR = ';', ROWTERMINATOR = '0x0a', FORMATFILE = 'formatfile.fmt', ERRORFILE = 'C:\\ProgramData\\Tools_TextileMagazine\\AdditionalFiles\\BulkInsertErrors.txt')
GO
SELECT *
FROM Orders
GO
当我尝试插入重复行(例如两次获取相同的 csv 文件)时出现异常,这会导致整个插入停止并回滚。很容易理解,因为我违反了主键约束。现在我只是显示一个消息框,让用户知道 csv 文件中存在重复项,但这当然不是一个正确的解决方案,实际上根本不是一个解决方案。我的问题是,有没有办法忽略这些重复的行并跳过它们并仅添加不重复的行?也许以某种方式尝试捕获?
如果不可能,从 csv 文件导入数据的“正确”(由于缺乏更好的词)方法是什么?这个异常给我带来了一些麻烦。我确实在某处读到,您可以设置一个临时表,将数据加载到其中,并在插入之前在两个表之间选择不同的值。但真的没有更简单的方法来实现批量插入吗?
您可以设置MAXERRORS
属性设置为相当高,这将允许插入有效记录并忽略重复项。不幸的是,这意味着数据集中的任何其他错误都不会导致加载失败。
或者,您可以设置BATCHSIZE
属性将在多个事务中加载数据,因此如果存在重复项,它只会回滚批次。
一种更安全但效率较低的方法是将 CSV 文件加载到一个单独的空表中,然后将它们合并到您提到的订单表中。就我个人而言,这就是我会这样做的方式。
这些解决方案都不是理想的,但我想不出一种忽略批量插入语法中的重复项的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)