我正在尝试从CSV文件
中的bulk insert
表测试中记录少量记录
CREATE TABLE Level2_import
(wkt varchar(max),
area VARCHAR(40),
)
BULK
INSERT level2_import
FROM 'D:\test.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
批量插入代码应该除去第一行并将数据插入表中。它摆脱了第一行好,但在分隔符部分混淆了。第一列是wkt,列值是双引号,并且在值中有逗号。
所以我想我的问题是,是否有办法告诉BULK INSERT
双引号部分是一列而不管其中的逗号是什么?
CSV文件如下所示,
"MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))", 123123.22
答案 0 :(得分:3)
您需要使用'格式文件'为批量插入实现文本限定符。从本质上讲,您需要教授每个字段中可能存在不同分隔符的批量插入。
创建一个名为" level_2.fmt"的文本文件。并保存它。
11.0
2
1 SQLCHAR 0 8000 "\"," 1 wkt SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 40 "\r\n" 2 area SQL_Latin1_General_CP1_CI_AS
第一行," 11.0"指的是您的SQL版本。第二行显示您的表[level2_import]有两列。之后的每一行都将描述一列,并遵循以下格式:
[源列号] [数据类型] [最小尺寸] [最大尺寸] [分隔符模式] [目标列号] [目标列名称] [数据库的区分大小写]
创建该文件后,您可以使用以下批量插入语句读入数据:
BULK INSERT level2_import
FROM 'D:\test.csv'
WITH
(
FIRSTROW = 2,
FORMATFILE='D:\level_2.fmt'
);
有关格式文件的详细说明,请参阅此blog。
答案 1 :(得分:0)
尝试将.fmt删除到该文件并使用.txt代替,这对我有用
答案 2 :(得分:0)
SQL Server 2017最终添加了对文本限定符和RFC 4180中定义的CSV format的支持。这样写就足够了:
BULK INSERT level2_import
FROM 'D:\test.csv'
WITH ( FORMAT = 'CSV', ROWTERMINATOR = '\n', FIRSTROW = 2 )
答案 3 :(得分:0)
我在处理dn包含逗号的LDAP数据时遇到此问题,其他包含dns的字段也是如此。尝试将字段终止符更改为另一个未使用的字符,例如管道|或分号;。在数据和文件定义中执行此操作。
因此代码应为:
CREATE TABLE Level2_import
(wkt varchar(max),
area VARCHAR(40),
)
BULK
INSERT level2_import
FROM 'D:\test.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
和您的CSV:
"MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))"; 123123.22