在SQL Server批量插入正确引用CSV文件(Bulk Insert Correctly Quo

2019-06-18 12:45发布

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