4

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

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

1、

1,""

1,''

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

我能做些什么?

4

2 回答 2

6

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

    | 编号 | 姓名
    | 1 | 空值
    | 1 | “”   
    | 1 | ''   

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

而不是让批量插入为您插入空字符串值,您可以让您的表格列具有默认值作为空字符串。

示例如下:


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 中的第一行将获得一个空字符串)

    | 编号 | 姓名
    | 1 |   
    | 1 | “”   
    | 1 | ''   
于 2013-03-23T08:06:47.417 回答
0

请记住,仅当您不使用选项 KEEPNULLS 时,才会插入指定的 DEFAULT 值。使用与上面相同的示例,如果您将选项添加KEEPNULLSBULK INSERT,即:

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

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

SELECT * FROM BulkInsertTest

现在会给你:

id  name
1   NULL
1   ""
1   ''

在您的示例中添加它似乎没有充分的理由KEEPNULLS,但我刚才遇到了一个类似的问题,KEEPNULLSBULK INSERT.

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

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

于 2014-01-03T10:55:49.653 回答