bcp 文件有时带有双引号

问题描述

我有一个带有 2 列 ID 和 CompanyName 的 csv 文件。 我想 bcp 到带有格式文件sqlserver 表。此文件以逗号分隔。 .csv 文件的问题是 Companyname 仅在有多个单词时才会用双引号引起来。

这是一个例子

CompanyID,CompanyName
1000,FirstCompanyName
2000,"Testing Comma Name"

我不知道如何为此编写格式文件。 这是我试过的

10.0
3
1      sqlCHAR             0        10      ",\""         1     CompanyID                sql_latin1_General_CP1_CI_AI
2      sqlCHAR             0        0       "\""          0     junk1                    sql_latin1_General_CP1_CI_AI
3      sqlCHAR             0        100     "\r\n"        2     CompanyName              sql_latin1_General_CP1_CI_AI

没有错误 当我在命令提示符中键入此内容

bcp "[a].b.[CompanyData]" in "C:\test.csv" -f C:\Data.fmt -t,-F2 -S "server1\prod01" -Uuername -Ppwd -e C:\Logs\error.log -o C:\Logs\outputlog.log 

没有错误,但表格中也没有任何内容

有人可以指导我吗?

谢谢 先生

解决方法

bcp 命令行实用程序无法处理 *.csv 文件,其中列具有零星的双引号作为分隔符。

一种可能的解决方案是将整行加载到暂存表中的宽单列中。之后,通过 bcp 或 BULK INSERT 使用 T-SQL 拆分为三列。

这是第二部分。 SQL Server 2017 及更高版本(由于增强的 SPLIT() 功能)

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (line_from_file NVARCHAR(MAX));
INSERT INTO @tbl (line_from_file) VALUES
(N'1000,FirstCompanyName'),(N'2000,"Testing Comma Name"');
-- DDL and sample data population,end

DECLARE @separator CHAR(1) = ',';

;WITH rs AS
(
    SELECT *,TRY_CAST('<root><r><![CDATA[' + 
         REPLACE(line_from_file,@separator,']]></r><r><![CDATA[') + ']]></r></root>' AS XML) AS xmldata
    FROM @tbl
)
-- INSERT INTO targetTable (CompanyID,CompanyName)
SELECT c.value('(r[1]/text())[1]','INT') AS CompanyID,TRIM('"' FROM c.value('(r[2]/text())[1]','NVARCHAR(100)')) AS CompanyName
FROM rs CROSS APPLY xmldata.nodes('/root') AS t(c);

输出

+-----------+--------------------+
| CompanyID |    CompanyName     |
+-----------+--------------------+
|      1000 | FirstCompanyName   |
|      2000 | Testing Comma Name |
+-----------+--------------------+