SQL 服务器只读取有效 JSON 的第一行
SQL Server is reading only first row from valid JSON
我的 JSON 如下所示。此 JSON 由 ADF 毫无问题地读取并导入所有行。
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
然而,当我使用以下查询从 SQL 中读取此内容时,它 returns 只有第一条记录。
SELECT * FROM OPENJSON(@JSONDATA, '$')
with (
Col1 varchar(25) '$.Row.Col1'
);
你知道为什么吗?
我认为您必须像下面这样更改 JSON 数据结构。你的也无效 JSON。尝试任何在线 JSON 验证器以查看差异。
正确的是:
[
{"Col1":"Val1", "Col2":"Val2"},
{"Col1":"Val1", "Col2":"Val2"},
{"Col1":"Val1", "Col2":"Val2"}
]
因为你的只是一个对象,所以它可能只有一行。 MSDN 也这样使用 OPENJSON
。
将其更改为数组后,您必须像这样编辑查询:
SELECT * FROM OPENJSON(@JSONDATA, '$')
with (
Col1 varchar(25) '$.Col1',
Col2 varchar(25) '$.Col2'
);
它现在获取屏幕截图中的所有行。
如果您无法将输入格式更改为使用数组,并且您知道对象由换行符分隔,则可以使用 STRING_SPLIT
将每个对象放入自己的行中:
SELECT JSON_VALUE(value, '$.Row.Col1')
FROM STRING_SPLIT(@JSONDATA, CHAR(10))
或者您可以预处理输入,使其 可由 OPENJSON
:
解析
SELECT *
FROM OPENJSON(N'[' + REPLACE(@JSONDATA, CHAR(13) + CHAR(10), ',') + N']')
WITH (
Col1 VARCHAR(25) '$.Row.Col1'
);
如果您没有行分隔符,我不确定这是否可以在 T-SQL.
中干净地完成
我的 JSON 如下所示。此 JSON 由 ADF 毫无问题地读取并导入所有行。
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
然而,当我使用以下查询从 SQL 中读取此内容时,它 returns 只有第一条记录。
SELECT * FROM OPENJSON(@JSONDATA, '$')
with (
Col1 varchar(25) '$.Row.Col1'
);
你知道为什么吗?
我认为您必须像下面这样更改 JSON 数据结构。你的也无效 JSON。尝试任何在线 JSON 验证器以查看差异。
正确的是:
[
{"Col1":"Val1", "Col2":"Val2"},
{"Col1":"Val1", "Col2":"Val2"},
{"Col1":"Val1", "Col2":"Val2"}
]
因为你的只是一个对象,所以它可能只有一行。 MSDN 也这样使用 OPENJSON
。
将其更改为数组后,您必须像这样编辑查询:
SELECT * FROM OPENJSON(@JSONDATA, '$')
with (
Col1 varchar(25) '$.Col1',
Col2 varchar(25) '$.Col2'
);
它现在获取屏幕截图中的所有行。
如果您无法将输入格式更改为使用数组,并且您知道对象由换行符分隔,则可以使用 STRING_SPLIT
将每个对象放入自己的行中:
SELECT JSON_VALUE(value, '$.Row.Col1')
FROM STRING_SPLIT(@JSONDATA, CHAR(10))
或者您可以预处理输入,使其 可由 OPENJSON
:
SELECT *
FROM OPENJSON(N'[' + REPLACE(@JSONDATA, CHAR(13) + CHAR(10), ',') + N']')
WITH (
Col1 VARCHAR(25) '$.Row.Col1'
);
如果您没有行分隔符,我不确定这是否可以在 T-SQL.
中干净地完成