示例表包含字段Id
(表的标识,一个整数);Name
(一个简单的属性,允许空值,是一个字符串)
我正在尝试包含以下内容的CSV:
1,
1,""
1,''
它们都没有给我提供空字符串作为批量插入的结果。 我正在使用SQL Server 2012。
我该怎么办?
示例表包含字段Id
(表的标识,一个整数);Name
(一个简单的属性,允许空值,是一个字符串)
我正在尝试包含以下内容的CSV:
1,
1,""
1,''
它们都没有给我提供空字符串作为批量插入的结果。 我正在使用SQL Server 2012。
我该怎么办?
| id | name | 1 | NULL | 1 | "" | 1 | ''
The reason is, the bulk insert will treat your first row, second column value as null; for other 2 rows, will take the second column value as not null, and take it as it is.
Instead of let Bulk Insert to insert empty string value for you, you can let you table column having default value as empty string.
Example as following:
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
| id | name | 1 | | 1 | "" | 1 | ''
KEEPNULLS
选项时,指定的DEFAULT值才会被插入。
使用上面的示例,如果您在BULK INSERT
中添加KEEPNULLS
选项,即:BULK INSERT BulkInsertTest
FROM '....\test.csv'
WITH
(
FIELDTERMINATOR ='\,',
ROWTERMINATOR ='\n',
KEEPNULLS
)
SELECT * FROM BulkInsertTest
现在将给你:
id name
1 NULL
1 ""
1 ''
在您的示例中似乎没有很好的理由添加KEEPNULLS
,但我刚遇到一个类似的问题,其中BULK INSERT
需要KEEPNULLS
。
我的解决方案是在分段表BulkInsertTest
中定义列[name]
为NOT NULL
,但请记住,默认列值将被忽略,并插入空字符串。
在此处查看更多信息:在批量导入(SQL Server)期间保留Nulls或使用默认值