Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server中带文本限定符的大容量插入_Sql Server_Bulkinsert_Spatial - Fatal编程技术网

Sql server SQL Server中带文本限定符的大容量插入

Sql server SQL Server中带文本限定符的大容量插入,sql-server,bulkinsert,spatial,Sql Server,Bulkinsert,Spatial,我正在尝试从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' ) 大容量插入代码应该去掉第一行并将数据插入表中。它可以去掉第

我正在尝试从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'
 )
大容量插入代码应该去掉第一行并将数据插入表中。它可以去掉第一行,但是在分隔符部分会混淆。第一列是wkt,列值是双引号,并且在值内有逗号

所以我想我的问题是,是否有办法告诉
批量插入
双引号部分是一列,而不考虑其中的逗号

CSV文件如下所示

 "MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))", 123123.22

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

创建一个名为“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'
);

有关格式文件的详细说明,请参阅本文档

尝试将.fmt删除到文件中,并改用.txt,这对我来说很有效

SQL Server 2017终于添加了对文本限定符和RFC 4180中定义的文本的支持。写下以下内容就足够了:

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

我在处理LDAP数据时遇到了这个问题,dn包含逗号,其他包含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

一个比我之前尝试的更简洁和相关的答案。非常感谢你的帮助。你知道我为什么会出现这个错误吗<代码>无法批量加载。文件“C:\mig\level_2.fmt”不存在。我已创建了包含建议内容的文件,但幸运的是,我猜您的文件位于SQL Server无法访问的位置。当文件在我的本地机器上时,我已经忘记了SQL Server正在远程运行并映射到不同的驱动器。尝试将该文件与您的csv文件放在同一文件夹中,这样您至少可以测试该功能。如果这样做有效,您可以将文件移回您想要的位置,并从SQL Server的角度确保它是一个有效的位置。希望能有所帮助。请您详细说明您的答案,并对您提供的解决方案进行更多描述,好吗?