我没有使用过多的SQL Server(我通常使用PostgreSQL)而且我很难相信/接受一个人根本无法使用BULK INSERT
从文本文件中插入NULL值,如果文件的值为null或缺少数据(NULL,NA,na,null, - ,。等)。
我知道BULK INSERT
如果该字段为空(link,则可以保留NULL
,这对我的案例来说不是一个很好的解决方案,因为我有> 50个文件,所有这些文件都是比较大> 25GB,所以我不想)。但我找不到告诉SQL Server / BULK INSERT
某种值应解释为NULL的方法。
我想说,在大多数工具中从文本文件导入数据时,这是非常标准的。 (例如PostgreSQL中的COPY table_name FROM 'file_path' WITH (DELIMITER '\t', NULL 'NULL')
或readr::read_delim(file = "file", delim = "\t", na = "NULL")
中的R
和readr
包,仅举几个例子。)
更令人讨厌的是,我要导入的文件实际上是从SQL Server导出的。似乎默认情况下,它不是将NULL作为空字段留在文本文件中,而是将值写入NULL(这会使文件变大,但无论如何)。所以" import"似乎很奇怪。一个工具(SQL Server)的功能(BULK INSERT
或bcp
实用程序)无法正确导入默认情况下由同一工具导出的文件。
我一直在谷歌上搜索(link1,link2,link3,link4)并找不到解决方法(不同于编辑我的文件到为空字段更改NULL,或将所有内容导入为varchar
,稍后在数据库中工作以更改类型等等)。所以我真的很感激任何想法。
为了一个可重复的例子,这里有一个示例表,我想导入存储在文本文件中的这个样本数据:
样本表:
CREATE TABLE test
(
[item][varchar](255) NULL,
[price][int] NULL
)
存储在file.txt
中的示例数据:
item1, 34
item2, NULL
item3, 55
导入数据......
BULK INSERT test
FROM 'file.txt'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
但是这失败了,因为在第二行它为整数字段找到NULL。但是,该字段允许NULL值。所以我希望它理解这只是一个NULL值而不是字符值。