I'm trying to import a correctly quoted CSV file, meaning data is only quoted if it contains a comma, e.g.:
41, Terminator, Black
42, "Monsters, Inc.", Blue
I observe that the first row imports correctly, but the second row errors in a manner that suggests the quoted comma was treated as a field separator.
I have seen suggestions such as this one
SQL Bulk import from CSV
to change the field terminator
FIELDTERMINATOR='","'
However, my CSV file only quotes fields that need it, so I do not believe that suggestion would work.
Can SQL Server's BULK IMPORT statement import a correctly quoted CSV file? How?
Answer 1:
不幸的是SQL Server解释引用的逗号作为分隔符。 这适用于BCP和BULK INSERT。
从http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
如果数据中出现终止符,它被解释为一个终止符,而不是数据,并且该字符后的数据被解释为属于下一个字段或记录。 因此,仔细选择您的终止符,以确保它们不会出现在你的数据。
Answer 2:
有这个另一种解决方案。
作为分隔符领域的一部分,通过编辑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
Answer 3:
我知道这是一个老话题,但这个功能现在已经因为的SQL Server 2017中实现你要找的参数是FIELDQUOTE =默认为“”“。查看更多关于https://docs.microsoft.com/en -us / SQL / T-SQL /语句/批量嵌件的Transact-SQL?视图= SQL服务器-2017
Answer 4:
请确保您已启用TextQualified选项,将其设置为"
。
Answer 5:
您还可以看看使用OPENROWSET与CSV文本文件中的数据提供者。
虽然您需要启用该功能,这应该是可能与SQL Server> = 2005的任何版本。
http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/5869d247-f0a0-4224-80b3-ff2e414be402
Answer 6:
我有这个同样的问题,我不希望有去SSIS路线,所以我发现了一个PowerShell脚本,易于运行和处理与该特定领域的逗号引号的情况下:
源代码和DLL的PowerShell脚本: https://github.com/billgraziano/CsvDataReader
下面是解释了使用一个博客: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
Answer 7:
我花了半天时间在这个问题上。 这是最好使用SQL Server进出口数据向导来导入。 有在向导,解决这个问题的设置。 这里详细截图: https://www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/谢谢
Answer 8:
我有同样的问题,与只是偶尔双引号一些文本数据。 我的解决办法是让批量加载导入双引号,然后运行对进口数据的更换。
例如:
批量插入CodePoint_tbl从 “F:\数据\地图\ CodePointOpen \数据\ CSV \ ab.csv” 与(FIRSTROW = 1,FIELDTERMINATOR = ' 'ROWTERMINATOR =' \ n');
更新CodePoint_tbl设置邮政编码=取代(邮编, ' “', '')其中CHARINDEX( '”',邮编)> 0
为了使痛苦少写剧本更换,只需复制并粘贴你的是这样的结果需要什么:
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;
Answer 9:
每CSV格式规范,我不认为它很重要,如果数据被正确引用与否,只要它符合规范。 过多的报价应该由解析器来处理,如果它的正确实施。 FIELDTERMINATOR
应该是逗号和ROWTERMINATOR
是线端-此表示标准CSV文件。 你有没有尝试使用这些设置导入数据?
文章来源: Bulk Insert Correctly Quoted CSV File in SQL Server