使用BULK INSERT在SQL Server中插入空字符串

4

示例表包含字段Id(表的标识,一个整数);Name(一个简单的属性,允许空值,是一个字符串)

我正在尝试包含以下内容的CSV:

1,

1,""

1,''

它们都没有给我提供空字符串作为批量插入的结果。 我正在使用SQL Server 2012。

我该怎么办?


请分享你的代码。 - user2063626
2个回答

8
据我所知,Bulk Insert 无法插入空字符串,它只能在保留 null 值或使用 keepnulls 选项或不使用 keepnulls 选项的情况下使用默认值。对于您的三个示例记录,在插入数据库后,应该像这样:
    | id    |  name 
    | 1     |  NULL 
    | 1     |  ""   
    | 1     |  ''   

The reason is, the bulk insert will treat your first row, second column value as null; for other 2 rows, will take the second column value as not null, and take it as it is.

Instead of let Bulk Insert to insert empty string value for you, you can let you table column having default value as empty string.

Example as following:


CREATE TABLE BulkInsertTest (id int, name varchar(10) DEFAULT '')

将同一个CSV文件批量插入到表中
BULK INSERT Adventure.dbo.BulkInsertTest
   FROM '....\test.csv'
   WITH 
      (
         FIELDTERMINATOR ='\,',
         ROWTERMINATOR ='\n'
      )
   SELECT * FROM BulkInsertTest

结果将如下所示:(CSV中的第一行将获得一个空字符串)
    | id    |  name 
    | 1     |   
    | 1     |  ""   
    | 1     |  ''   

这段时间在互联网上寻找另一个答案,结果一无所获,让我感到很沮丧。谢谢你的回复! - mishamosher

1
请注意,只有在不使用KEEPNULLS选项时,指定的DEFAULT值才会被插入。 使用上面的示例,如果您在BULK INSERT中添加KEEPNULLS选项,即:
BULK INSERT BulkInsertTest
FROM '....\test.csv'
WITH 
(
    FIELDTERMINATOR ='\,',
    ROWTERMINATOR ='\n',
    KEEPNULLS
)

将导致默认列值被忽略,并插入空字符串的NULL值,即:
SELECT * FROM BulkInsertTest

现在将给你:

id  name
1   NULL
1   ""
1   ''

在您的示例中似乎没有很好的理由添加KEEPNULLS,但我刚遇到一个类似的问题,其中BULK INSERT需要KEEPNULLS

我的解决方案是在分段表BulkInsertTest中定义列[name]NOT NULL,但请记住,默认列值将被忽略,并插入空字符串。

在此处查看更多信息:在批量导入(SQL Server)期间保留Nulls或使用默认值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接