示例表包含字段Id
(表的标识,整数); Name
(一个允许空值的简单属性,它是一个字符串)
我正在尝试包含此内容的CSV:
1,
1 “”
1 ''
由于批量插入,它们都没有给我一个空字符串。我正在使用SQL Server 2012。
我该怎么办?
答案 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)