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.

中干净地完成