我有一个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.
我尝试过其他几种组合,但是无法做到这一点。任何帮助或指导都将受到广泛赞赏。
答案 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' )
希望这有帮助。