BULK INSERT NULL值的解决方法[SQL Server]

时间:2018-03-12 15:21:40

标签: sql-server bulkinsert

我没有使用过多的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")中的Rreadr包,仅举几个例子。)

更令人讨厌的是,我要导入的文件实际上是从SQL Server导出的。似乎默认情况下,它不是将NULL作为空字段留在文本文件中,而是将值写入NULL(这会使文件变大,但无论如何)。所以" import"似乎很奇怪。一个工具(SQL Server)的功能(BULK INSERTbcp实用程序)无法正确导入默认情况下由同一工具导出的文件。

我一直在谷歌上搜索(link1link2link3link4)并找不到解决方法(不同于编辑我的文件到为空字段更改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值而不是字符值。

0 个答案:

没有答案