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

我试图导入正确引用的CSV文件,这意味着数据只有在包含逗号时才被引用,例如:

41, Terminator, Black 42, "Monsters, Inc.", Blue 

我观察到,第一行正确导入,但第二行错误以暗示引用逗号的方式被视为字段分隔符。

我见过这样的build议

从SQL CSV批量导入

改变字段终止符

FIELDTERMINATOR = ' “”'

但是,我的CSV文件只引用需要它的字段,所以我不相信这个build议会起作用。

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

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

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

如果数据中出现终止符,则将其解释为终止符,而不是数据,并且将该字符后面的数据解释为属于下一个字段或logging。 因此,仔细select您的终结者,以确保他们永远不会出现在您的数据。

还有另一个解决scheme。

考虑引号作为字段分隔符的一部分,通过编辑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 

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

 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 

确保您已启用TextQualified选项并将其设置为“”。

您也可以使用OpenRowSet和CSV文本文件数据提供程序。

这应该是可能的任何版本的SQL Server> = 2005,但您需要启用该function。

http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/5869d247-f0a0-4224-80b3-ff2e414be402

我也有同样的问题,我不想去SSIS路由,所以我find了一个很容易运行的PowerShell脚本,并在那个特定的字段中用逗号来处理引号:

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

以下是一个解释使用情况的博客: http : //www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server

我有同样的问题,数据只偶尔双引号的文字。 我的解决scheme是让BULK LOAD导入双引号,然后对导入的数据运行REPLACE。

例如:

使用(FIRSTROW = 1,FIELDTERMINATOR =',',ROWTERMINATOR ='\ n')从“F:\ Data \ Map \ CodePointOpen \ Data \ CSV \ ab.csv”批量插入CodePoint_tbl;

更新CodePoint_tbl设置邮政编码=replace(邮政编码,'“','')其中charindex('”',邮政编码)> 0

为了减less编写REPLACE脚本的痛苦,只需要从这样的结果中复制和粘贴你需要的东西:

 select C.ColID, C.[name] as Columnname into #Columns from syscolumns C join sysobjects T on C.id = T.id where T.[name] = 'User_tbl' order by 1; declare @QUOTE char(1); set @QUOTE = Char(39); select 'Update User_tbl set '+ColumnName+'=replace('+ColumnName+',' + @QUOTE + '"' + @QUOTE + ',' + @QUOTE + @QUOTE + '); GO' from #Columns where ColID > 2 order by ColID; 

我在这个问题上花了半天的时间。 最好使用SQL Server导入和导出数据向导导入。 该向导中有一个设置可以解决这个问题。 详细的截图在这里: https : //www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/谢谢

根据CSV格式规范,如果数据是正确引用的,我认为不重要,只要符合规范即可。 如果执行得当,parsing器应该处理过多的引号。 FIELDTERMINATOR应该是逗号,而ROWTERMINATOR是行尾 – 这表示一个标准的CSV文件。 您是否尝试使用这些设置导入数据?