在SQL Server中使用文本限定符批量插入

时间:2014-09-08 14:17:49

标签: sql-server bulkinsert spatial

我正在尝试从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

4 个答案:

答案 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