SQL Server仅从有效JSON中读取第一行

SQL Server仅从有效JSON中读取第一行,json,sql-server-2016,azure-sql-database,Json,Sql Server 2016,Azure Sql Database,我的JSON如下所示。ADF读取此JSON时没有问题,并导入所有行 {"Row":{"Col1":"Val1", "Col2":"Val2"}} {"Row":{"Col1":"Val1", "Col2":"Val2"}} {"Row":{"Col1":"Val1", "Col2":"Val2"}} 然而,当我使用下面的查询从SQL中读取时,它只返回第一条记录 SELECT * FROM OPENJSON(@JSONDATA, '$') with ( Col1 varchar(25)

我的JSON如下所示。ADF读取此JSON时没有问题,并导入所有行

{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
{"Row":{"Col1":"Val1", "Col2":"Val2"}}
然而,当我使用下面的查询从SQL中读取时,它只返回第一条记录

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"}
]
因为你的只是一个对象,它可能只会得到一行。像这样使用
OPENJSON

将其更改为数组后,必须按如下方式编辑查询:

SELECT * FROM OPENJSON(@JSONDATA, '$')
with (
    Col1 varchar(25) '$.Col1',
    Col2 varchar(25) '$.Col2'
);
它现在得到了屏幕截图中的所有行


如果无法将输入格式更改为使用数组,并且知道对象由换行符分隔,则可以使用
STRING\u 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是一个很大的源代码,我们无法控制它。想知道Azure ADF是如何加载这个JSON的。@HemantChandurkar,您可以保留您的模式,只需转换为数组
[{“Row”:{“Col1”:“Val1”,“Col2”:“Val2”},{“Row”:{“Col1”:“Val1”,“Col2”:“Val2”},{“Row”:{“Col1”:“Val1”,“Col2”:“Val2”},