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

时间:2013-03-23 00:14:42

标签: sql sql-server sql-server-2012 bulkinsert

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

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

  

1,

     

1 “”

     

1 ''

由于批量插入,它们都没有给我一个空字符串。我正在使用SQL Server 2012。

我该怎么办?

2 个答案:

答案 0 :(得分:4)

据我所知,批量插入不能插入空字符串,它可以保留空值或使用keepnulls选项或没有keepnulls选项的默认值。对于3个样本记录,在插入数据库之后,它应该是:

    | id    |  name 
    | 1     |  NULL 
    | 1     |  ""   
    | 1     |  ''   

原因是,批量插入会将您的第一行,第二列值视为null;对于其他2行,将第二列值视为非空,并按原样保留。

不要让Bulk Insert为您插入空字符串值,而是可以让表格列的默认值为空字符串。

示例如下:


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

Bulk Insert same CSV file into table
BULK INSERT Adventure.dbo.BulkInsertTest
   FROM '....\test.csv'
   WITH 
      (
         FIELDTERMINATOR ='\,',
         ROWTERMINATOR ='\n'
      )
   SELECT * FROM BulkInsertTest

结果如下:( CSV中的第一行将获得一个空字符串)

    | id    |  name 
    | 1     |   
    | 1     |  ""   
    | 1     |  ''   

答案 1 :(得分:0)

请注意,如果您未使用KEEPNULLS选项,则只会插入指定的DEFAULT值。 使用与上面相同的示例,如果您将选项KEEPNULLS添加到BULK INSERT,即:

BULK INSERT BulkInsertTest
FROM '....\test.csv'
WITH 
(
    FIELDTERMINATOR ='\,',
    ROWTERMINATOR ='\n',
    KEEPNULLS
)

将导致忽略默认列值,并从空字符串插入NULL,即:

SELECT * FROM BulkInsertTest

现在会给你:

id  name
1   NULL
1   ""
1   ''

在您的示例中似乎没有充分的理由添加KEEPNULLS,但我刚才遇到了类似的问题,KEEPNULLS中需要BULK INSERT

我的解决方案是在登台表[name] BulkInsertTest中定义列NOT NULL,但请记住,DEFAULT列值会被忽略,而是插入一个空字符串。

在此处查看更多内容:Keep Nulls or UseDefault Values During Bulk Import (SQL Server)