2013-03-23 56 views
4

示例表包含字段Id(表的标识,一个整数); Name(一个简单的属性,允许空值,这是一个字符串)在带有BULK INSERT的SQL Server上插入一个空字符串

我想包含这个CSV:

1,

1 “”

1, ''

作为批量插入的结果,它们都不会给我一个空字符串。我正在使用SQL Server 2012.

我该怎么办?

+0

请分享您的代码 – 2013-03-23 01:26:46

回答

3

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

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

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

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

示例如下:


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  | '' 
+0

得到坚果这么长的时间寻找互联网的另一个答案......没有了。感谢您的回应! – mishamosher 2013-05-16 04:46:42

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日在你的例子中,但我刚才遇到了类似的问题,BULK INSERT需要KEEPNULLS

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

查看更多在这里:Keep Nulls or UseDefault Values During Bulk Import (SQL Server)