问题描述
我有一个带有 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 |
+-----------+--------------------+