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

use*_*877 3 sql-server bulkinsert spatial

我正在尝试bulk insert从 CSV 文件中的表测试中删除几条记录,

 CREATE TABLE Level2_import 
 (wkt varchar(max),
 area VARCHAR(40),
 ) 


BULK
 INSERT level2_import 
 FROM 'D:\test.csv'
 WITH
 (
 FIRSTROW = 2,
 FIELDTERMINATOR = ',',
 ROWTERMINATOR = '\n'
 )
Run Code Online (Sandbox Code Playgroud)

批量插入代码应该去掉第一行并将数据插入到表中。它摆脱了第一行,但在分隔符部分变得混乱。第一列是 wkt,列值是双引号,值内有逗号。

所以我想我的问题是是否有办法告诉BULK INSERT双引号部分是一列,而不管其中的逗号如何?

CSV 文件如下所示,

 "MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))", 123123.22
Run Code Online (Sandbox Code Playgroud)

Rya*_* B. 5

您需要使用“格式文件”来实现批量插入的文本限定符。本质上,您需要告诉批量插入每个字段中可能存在不同的分隔符。

创建一个名为“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
Run Code Online (Sandbox Code Playgroud)

第一行“11.0”指的是您的 SQL 版本。第二行显示您的表 [level2_import] 有两列。之后的每一行将描述一个列,并遵循以下格式:

[源列号][数据类型][最小大小][最大大小][分隔符模式][目标列号][目标列名][数据库区分大小写]

创建该文件后,您可以使用以下批量插入语句读入数据:

BULK INSERT level2_import
FROM 'D:\test.csv'
WITH 
(
  FIRSTROW = 2,
  FORMATFILE='D:\level_2.fmt'
);
Run Code Online (Sandbox Code Playgroud)

有关格式文件的详细说明,请参阅此博客


Pan*_*vos 5

SQL Server 2017 终于添加了对文本限定符和RFC 4180 中定义的CSV 格式的支持。写下应该就够了:

BULK INSERT level2_import 
FROM 'D:\test.csv'
WITH ( FORMAT = 'CSV', ROWTERMINATOR = '\n', FIRSTROW = 2 )
Run Code Online (Sandbox Code Playgroud)