更新:最后使用Johnny创建的这个方法,然后修改它以跳过重复。很有魅力,而且速度很快。链接: http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/
我一直在寻找答案,但似乎找不到答案。我正在执行local大容量插入,从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文件导入数据的“正确”(因为缺少更好的单词)是什么?这个例外给我带来了一点麻烦。我确实读到了一些地方,您可以设置一个临时表,将数据加载到其中,并在插入之前在两个表之间选择distinct。但是,真的没有比批量插入更简单的方法了吗?
发布于 2014-12-15 13:22:12
您可以将MAXERRORS属性设置为相当高的值,这将允许插入有效的记录,忽略重复的记录。不幸的是,这将意味着数据集中的任何其他错误都不会导致加载失败。
或者,您可以设置BATCHSIZE属性,该属性将在多个事务中加载数据,因此,如果存在重复,它将只回滚批处理。
一种更安全、但效率较低的方法是将CSV文件加载到一个单独的空表中,然后将它们合并到您提到的orders表中。就我个人而言,我就是这样做的。
这些解决方案都不是理想的,但我想不出在批量插入语法中忽略重复项的方法。
发布于 2020-12-05 06:58:47
首先,在不存在的地方,没有像批量插入这样的直接解决方案。您可以使用以下解决方案。
当使用大容量插入时,有两种方案
案例1的解决方案:设置MAXERRORS =0设置BATCHSIZE = csv文件中的行总数
在BULK INSERT中使用上述语句将导致整个BULK INSERT操作回滚,即使存在单个错误,这也将防止导入行,即使少数行中有错误。您需要解决所有导入错误才能完成导入操作。此方法将防止在导入50行、导入30行而不导入时发生情况。然后,您必须在CSV文件中搜索失败的行,然后重新导入它们,或者从SQL表中删除所有导入的行,然后再次进行批量插入。
案例2的解决方案: 1>您可以在现有表上运行select查询,右键单击并在CSV中导出。如果您有任何电子表格程序,那么将数据粘贴到导入数据下面,并在主键列上使用条件格式来突出显示重复的行并删除它们。然后使用大容量插入操作。
2>设置MAXERRORS =行数,并使用批量插入导入csv文件。这是不安全和推荐的方式,因为除了重复的关键错误之外,可能还有其他类型的错误。
3>设置BATCHSIZE =1和MAXERRORS =高数字,并使用批量插入导入csv文件。这将导入所有没有错误的行,任何有错误的行都将被跳过。如果数据集很小,并且可以通过观察表列(如id number列)来直观地标识未导入的行,则这是非常有用的。
4>右键单击现有表,选择table as > Crete >新建查询窗口。只需重命名表名并更改为像table_staging一样的暂存名称。在暂存表中进行批量插入,然后运行第二个查询,将数据从暂存表复制到主表,并使用WHERE子句检查是否存在行/pk。这是一种安全得多的方法,但强制您创建一个暂存表。
https://stackoverflow.com/questions/27484973
复制相似问题