示例表包含字段Id
(表的标识,整数);Name
(一个允许空值的简单属性,它是一个字符串)
我正在尝试包含以下内容的 CSV:
1、
1,""
1,''
由于批量插入,它们都没有给我一个空字符串。我正在使用 SQL Server 2012。
我能做些什么?
示例表包含字段Id
(表的标识,整数);Name
(一个允许空值的简单属性,它是一个字符串)
我正在尝试包含以下内容的 CSV:
1、
1,""
1,''
由于批量插入,它们都没有给我一个空字符串。我正在使用 SQL Server 2012。
我能做些什么?
据我所知,批量插入不能插入空字符串,它可以保留空值或使用带有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 | ''
请记住,仅当您不使用选项 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]
我的解决方案是在临时表中定义 make 列,BulkInsertTest
NOT NULL
但请记住 DEFAULT 列值被忽略,而是插入一个空字符串。