首页 > 解决方案 > 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 

没有错误,但表中也没有任何错误。

有人可以指导我吗?

谢谢先生

标签: sql-servercmdbcp

解决方案


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

一种可能的解决方案是将整行加载到临时表中的宽单列中。之后使用 T-SQL 通过 bcp 或BULK INSERT.

这是第二部分。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 |
+-----------+--------------------+

推荐阅读