我正在使用BCP utility导入.csv
文件。其中一列的值以逗号分隔,但用双引号引起来。 BCP工具无法检测到它,并且错误地将数据上传到我的表中。
这是一个复制人:
CREATE TABLE [dbo].[test_temptable]
(
--[ID] [int] IDENTITY(1,1) NOT NULL,
[Column1] [varchar](100) NULL,
[Column2] [varchar](100) NULL,
[Column3] [varchar](100) NULL,
/*PRIMARY KEY CLUSTERED ([ID] ASC)
*/
)
ON [PRIMARY]
GO
inputData.csv
文件中的测试数据:
value1,"test,test",value3
当我运行bcp命令时,它会起作用
bcp "testDB.dbo.test_temptable" in c:\temp\test\inputData.csv -c -t, -T -S "testDBServer" -e c:\temp\test\error.csv
1 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1 Average : (1000.00 rows per sec.)
但是表中的数据不正确:
第2列应该已经过 test,test 和第3列 value3 。
我在做什么错?有指针吗?谢谢大家
答案 0 :(得分:1)
长话短说..它不适用于数据中的逗号和定界符。即使Excel可以处理,SQL BCP也不太友好:
sql server Bulk insert csv with data having comma
过去我不得不这样做,您有一些选择:
在Excel中打开.csv
文件,将其另存为制表符分隔的文件(这使其成为.txt
),然后可以运行此文件以指示您现在正在使用{ {1}}作为分隔符:
tab
当然,如果您的数据中包含选项卡。但是,使用这个小例子,您提供了确实有效。
您可以尝试在SQL内部使用bcp "testDB.dbo.test_temptable" in c:\temp\test\inputData.csv -c -t"\t" -T -S "testDBServer" -e c:\temp\test\error.csv
BULK INSERT
或SSIS
,但老实说,我尽量避免这种额外的开销/复杂性。