【问题标题】:BULK INSERT from CSV, strings with ""从 CSV 批量插入,带有“”的字符串
【发布时间】:2017-09-21 11:44:27
【问题描述】:

我尝试将数据从 .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

在我的示例中,city 为空,在我的 csv 中显示为在批量插入中,“”之间的哪个会被忽略?

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

【问题讨论】:

  • 我没有你的问题的答案,但我想说ROWTERMINATOR = '\n' 被sql server 忽略了。而ROWTERMINATOR = '\r\n' 将是used。大多数时候这会起作用,但并非总是如此。为了使用换行符作为行终止符,请使用ROWTERMINATOR = '0x0a'
  • 试试;对于场终结者。据我所知,excel 使用 ;默认为字段终止符。
  • 我从我的 ftp 上的外部服务获取这个 csv...我尝试与他们交谈...但是,我认为逗号是 sql 上的默认终止符...

标签: sql-server csv bulkinsert


【解决方案1】:

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

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

下图解释了各个字段的作用。

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

More info

【讨论】:

  • 谢谢,我通过创建到 csv 的链接服务器解决了这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 2016-12-28
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多