【问题标题】:SQL Server is reading only first row from valid JSONSQL Server 仅从有效 JSON 中读取第一行
【发布时间】:2017-07-05 13:16:26
【问题描述】:

我的 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 sql-server-2016 azure-sql-database


    【解决方案1】:

    我认为您必须更改 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'
    );
    

    它现在获取所有行,如屏幕截图所示。

    【讨论】:

    • 谢谢!但是 JSON 很大,来自我们无法控制的外部源。想知道 MS Azure ADF 是如何加载这个 JSON 的。
    • @HemantChandurkar ,您可以保留您的架构,只需转换为数组[{"Row":{"Col1":"Val1", "Col2":"Val2"}}, {"Row":{"Col1":"Val1", "Col2":"Val2"}}, {"Row":{"Col1":"Val1", "Col2":"Val2"}}]
    【解决方案2】:

    如果您无法将输入格式更改为使用数组,并且您知道对象由换行符分隔,则可以使用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 中干净地完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-04
      • 2016-03-14
      • 2023-04-08
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      相关资源
      最近更新 更多