我正在使用外部表将存储在Blob中的csv的数据加载到Azure SQL数据仓库中的表。 csv使用字符串定界符(双引号),空字符串表示为2个双引号(“”)。
我希望在表中将空列视为NULL。我使用的外部文件格式是使用USE_TYPE_DEFAULT = FALSE设置的,但这似乎不起作用,因为将空列导入为空字符串。而且只有当列为字符串,数字列正确转换为NULL时,这种情况才会发生。
我还要使用不同的外部文件格式导入不包含字符串定界符的其他csv,并将那些空列导入为NULL。因此,它似乎与STRING_DELIMITER选项有关。
csv:
col1;col2;col3;col4;col5;col6
"a";"b";"c";"1";"2";"3"
"d";"";"f";"4";"";"6"
外部文件格式的代码:
CREATE EXTERNAL FILE FORMAT eff_string_del
WITH (
FORMAT_TYPE = DELIMITEDTEXT
,FORMAT_OPTIONS(
FIELD_TERMINATOR = ';'
,STRING_DELIMITER = '0x22'
,FIRST_ROW = 2
,USE_TYPE_DEFAULT = False)
)
使用外部文件格式的表代码:
CREATE EXTERNAL TABLE dbo.test (
col1 varchar(1) null
,col2 varchar(1) null
,col3 varchar(1) null
,col4 int null
,col5 int null
,col6 int null
)
WITH (
DATA_SOURCE = [EDS]
,LOCATION = N'test.csv'
,FILE_FORMAT = eff_string_del
,REJECT_TYPE = VALUE
,REJECT_VALUE = 0
)
查询外部表时的结果:
SELECT *
FROM [dbo].[test]
col1 col2 col3 col4 col5 col6
---- ---- ---- ----------- ----------- -----------
a b c 1 2 3
d f 4 NULL 6
有人可以帮我解释发生了什么或我做错了什么吗?
答案 0 :(得分:0)
您是否考虑过在该字段中添加值NULL
而不是""
?
请参阅以下我使用以下代码执行的测试:
declare @mytable table
(id int identity primary key, column1 varchar(100))
insert into @mytable (column1) values ('test1')
insert into @mytable (column1) values ('test2')
insert into @mytable (column1) values (null)
insert into @mytable (column1) values ('test3')
insert into @mytable (column1) values (null)
select
*
from @mytable
结果如下:
这对您有用吗?
答案 1 :(得分:0)
以外部文件格式使用USE_TYPE_DEFAULT = False
。
在分隔的文本文件中使用单词NULL存储的所有NULL值都将作为字符串NULL导入。
例如:
CREATE EXTERNAL FILE FORMAT example_file_format
WITH (FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS(
FIELD_TERMINATOR = ',',
STRING_DELIMITER = '"',
FIRST_ROW = 2,
USE_TYPE_DEFAULT = False)
)