来自CSV的BULK INSERT,带有""

时间:2017-09-21 11:44:27

标签: sql-server csv bulkinsert

我尝试将.csv中的数据插入到MS SQL数据库中。我是这样做的:

CREATE TABLE [dbo].[prescreen_candidateData](
[id] [varchar](50) DEFAULT '',
[email] [varchar](50) DEFAULT '',
[firstname] [varchar](50) DEFAULT '',
[lastname] [varchar](50) DEFAULT '',
[city] [varchar](50) DEFAULT '',
[address] [varchar](50) DEFAULT '',
[phone] [varchar](50) DEFAULT '',
[birthday] [varchar](50) DEFAULT '',
[candidateurl] [varchar](50) DEFAULT '',
[createdAt] [varchar](50) DEFAULT '') ON [PRIMARY]

创建表后,我尝试插入如下:

BULK INSERT [dbo].[prescreen_candidateData] FROM '\\server2\prescreen$\candidateData.csv' WITH (
FIRSTROW = 2,
FIELDTERMINATOR = '\,',
ROWTERMINATOR = '\n',
KEEPNULLS
);

我的.csv建立在这样的基础上:

id,email,firstname,lastname,city,address,phone,birthday,candidateurl,createdAt

例如:

58282,xx_yy@gmail.com,Michael,Meier,,"""Street Nr 12,08159,City""",012345678910,"1996-08-29 00:00:00",https://linktoemployee, 2016-05-12

在我的例子中,城市是空的,在我的csv中它显示为,这没关系,但我的问题是adressfield,因为adressfield包含,但是,是终结者......我怎么能这样做,那个在批量插入中,它位于""会被忽略吗?

编辑: **我通过创建一个到csv的链接服务器来解决它...按我的意愿工作**

1 个答案:

答案 0 :(得分:2)

您应该使用格式文件来描述要上传的数据。除此之外,格式文件还允许您为数据中的各个列指定分隔符。您需要在查询中引用格式文件:

BULK INSERT [dbo].[prescreen_candidateData] FROM '\\server2\prescreen$\candidateData.csv' 
WITH (
FORMATFILE='\\server2\prescreen$\YourFormat.fmt'
);

对于您的场景,请创建一个这样的格式文件(请注意,它需要在文件末尾添加一个新行,否则会出错):

9.0
10
1       SQLCHAR       0       50       ","      1     id         ""
2       SQLCHAR       0       50     ","      2     email         SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       50     ","      3     firstname         SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       50     ","   4     lastname         SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR       0       50     ",\"\"\""   5     city         SQL_Latin1_General_CP1_CI_AS
6       SQLCHAR       0       50     "\"\"\","   6     address         SQL_Latin1_General_CP1_CI_AS
7       SQLCHAR       0       50     ",\""   7     phone         SQL_Latin1_General_CP1_CI_AS
8       SQLCHAR       0       50     "\","   8     birthday         SQL_Latin1_General_CP1_CI_AS
9       SQLCHAR       0       50     ","   9     candidateurl         SQL_Latin1_General_CP1_CI_AS
10       SQLCHAR       0       50     "\r\n"   10     createdAt         SQL_Latin1_General_CP1_CI_AS
  

下图说明了各个领域的用途。

enter image description here

您会注意到格式文件允许您为每个字段指定终止符。您还会注意到我指定了一个逗号,后跟3个引号作为City的分隔符(“,\”\“\”)。类似地,对于地址字段,我指定了3个引号的分隔符,后跟逗号(\“\”\“,)。因此,城市和地址分隔符中的所有内容将一起上传,包括任何”,“。通过在您的引号中包含引号您可以避免使用数据上传报价,也可以让您在数据上传中使用逗号','

More info