批量插入fmt文本限定符

时间:2016-07-11 11:29:13

标签: sql-server ssis bulkinsert bcp

我有一个BULK INSERT任务,它从csv获取数据并导入到表中。唯一的问题是其中一列可以包含逗号,因此导入无法按预期工作。

我试图通过创建格式(fmt)文件来解决这个问题,我在下面详细介绍了其中的内容: -

9.0
6
1       SQLCHAR       0       50      ","       1     "Identifier"                                 Latin1_General_CI_AS
2       SQLCHAR       0       50      ","       2     "Name"                                             Latin1_General_CI_AS
3       SQLCHAR       0       50      ","       3     "Date of Birth"                                            Latin1_General_CI_AS
4       SQLCHAR       0       50      ","       4     "Admission"                                                Latin1_General_CI_AS
5       SQLCHAR       0       50      ","       5     "Code"                               Latin1_General_CI_AS
6       SQLCHAR       0       50      "\r\n"   6     "Length"                                                      Latin1_General_CI_AS

导致我痛苦的一栏是第2栏“名字”。

我已经尝试了一些事情来确定列是文本限定的并且包含逗号,但是我没有得到我想要的结果。

如果我改为: -

"\"," - 我得到类似的东西 - “Richardson,Mat

这是不对的,所以我尝试了这个,正如其他一些论坛/网站所建议的那样: -

"\",\""

这根本不起作用,实际上给了我错误

Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)".Bulk load: An unexpected end of file was encountered in the data file.

我尝试过其他几种组合,但是无法做到这一点。任何帮助或指导都将受到广泛赞赏。

1 个答案:

答案 0 :(得分:1)

没有真正回答有关格式文件的问题,但可能会让您解决问题。

格式文件是从20世纪80年代到我的难以理解的奥秘,批量插入是非常繁琐和无情的。因此,我倾向于使用几行powershell来清理数据。这是我最近用于将CSV转换为管道分离的示例,以删除输出上的一些随机引用并允许记录中的逗号:

Import-Csv -Path  $dirtyCsv | 
ConvertTo-CSV  -NoType -Delimiter '|' | 
%{ $_.Replace('"','') } | 
Out-File $cleanCsv

你明白了......

然后简单导入:

BULK INSERT SomeTable FROM 'clean.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n' )

希望这有帮助。