批量插入SQL Server中正确引用的CSV文件

Eri*_* J. 49 sql-server csv bulkinsert

我正在尝试导入正确引用的CSV文件,这意味着只有在包含逗号的情况下才会引用数据,例如:

41, Terminator, Black
42, "Monsters, Inc.", Blue
Run Code Online (Sandbox Code Playgroud)

我观察到第一行正确导入,但第二行错误以建议引用的逗号被视为字段分隔符.

我见过这样的建议

从CSV导入SQL批量导入

更改字段终止符

FIELDTERMINATOR = ' ""'

但是,我的CSV文件仅引用需要它的字段,因此我不相信该建议会起作用.

SQL Server的BULK IMPORT语句可以导入正确引用的CSV文件吗?怎么样?

iru*_*var 28

不幸的是,SQL Server将引用的逗号解释为分隔符.这适用于BCP和批量插入.

来自http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx

如果数据中出现终止符,则将其解释为终结符,而不是数据,并将该字符后的数据解释为属于下一个字段或记录.因此,请仔细选择终结器,以确保它们永远不会出现在您的数据中.

  • 自 SQL Server 2017 起,我们有了可用于批量插入的 FORMAT='CSV' 选项。如果您的 CSV 文件已完全引用,则字段现在可以包含逗号。 (5认同)

Raf*_*via 18

还有另一种解决方案.

通过编辑fmt文件,将引号视为字段分隔符的一部分.

您可以查看此信息以获取更多信息:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/02/04/how-to-remove-unwanted-quotation-marks-while-importing-a-data-file.aspx

以上链接的摘录:

删除引号的唯一方法是修改导入操作期间指定的列分隔符.这里唯一的缺点是,如果您检查要插入的数据,您将很快意识到每个列的列分隔符是不同的(上面突出显示的分隔符).

因此,要为每列指定不同的列分隔符,如果计划使用批量插入或BCP,则需要使用格式文件.如果为上述表结构生成格式文件,则如下所示:

9.0
3
1       SQLCHAR       0       5       "\t"     1     FName              SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       5       "\t"     2     LName              SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       50      "\r\n"   3     Company            SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)

修改格式文件以表示每列的正确列分隔符.要使用的新格式文件如下所示:

9.0
4
1       SQLCHAR       0       0     "\""      0     FIRST_QUOTE      SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       5     "\",\""   1     FNAME               SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       5     "\",\""   2     LNAME            SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       50    "\"\r\n"  3     COMPANY          SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)


小智 13

我知道这是一个古老的话题,但是这个功能现在已经从SQL Server 2017开始实现了.您正在寻找的参数是FIELDQUOTE =默认为'"'.详见https://docs.microsoft.com/en -us/SQL/T-SQL /语句/批量嵌件的Transact-SQL?视图= SQL服务器-2017

  • SQL Server 花了相当长的时间才添加适当的支持:-) (2认同)

小智 8

确保已启用TextQualified选项并将其设置为".


小智 5

我遇到了同样的问题,我不想走 SSIS 路线,所以我找到了一个 PowerShell 脚本,它易于运行并处理该特定字段中带逗号的引号的情况:

PowerShell 脚本的源代码和 DLL:https : //github.com/billgraziano/CsvDataReader

这是一个解释用法的博客:http : //www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server