示例表包含字段Id
(表的标识,一个整数); Name
(一个简单的属性,允许空值,这是一个字符串)在带有BULK INSERT的SQL Server上插入一个空字符串
我想包含这个CSV:
1,
1 “”
1, ''
作为批量插入的结果,它们都不会给我一个空字符串。我正在使用SQL Server 2012.
我该怎么办?
示例表包含字段Id
(表的标识,一个整数); Name
(一个简单的属性,允许空值,这是一个字符串)在带有BULK INSERT的SQL Server上插入一个空字符串
我想包含这个CSV:
1,
1 “”
1, ''
作为批量插入的结果,它们都不会给我一个空字符串。我正在使用SQL Server 2012.
我该怎么办?
据我所知,批量插入不能插入空字符串,它可以保留空值或使用默认值与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 | ''
得到坚果这么长的时间寻找互联网的另一个答案......没有了。感谢您的回应! – mishamosher 2013-05-16 04:46:42
请紧请注意,如果您不使用选项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
日在你的例子中,但我刚才遇到了类似的问题,BULK INSERT
需要KEEPNULLS
。
我的解决方案是在临时表BulkInsertTest
NOT NULL
中定义使列[name]
,但请记住DEFAULT列的值将被忽略,而是插入一个空字符串。
查看更多在这里:Keep Nulls or UseDefault Values During Bulk Import (SQL Server)
请分享您的代码 – 2013-03-23 01:26:46