You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Azure Data Factory中用SQL OPENJSON提取嵌套JSON单行原始对象

解决SQL OPENJSON提取每行原始JSON对象的问题

我来帮你搞定这个需求!你需要的是迭代解析JSON数组里的每个对象,同时完整保留每个对象的原始JSON格式,用OPENJSON结合JSON_QUERY就能轻松实现,不需要提前指定对象的结构。

直接实现的SQL代码

先看最简洁的解决方案,针对你提供的JSON结构:

-- 声明你的JSON数据
DECLARE @json NVARCHAR(MAX) = N'{ "rows":[ { "name":"Name1", "attribute1":"attribute1", "attribute2":"attribute2" }, { "name":"Name2", "attribute1":"attribute1", "attribute2":"attribute2" }, { "name":"Name3", "attribute1":"attribute1", "attribute2":"attribute2" } ] }';

-- 提取每行的原始JSON对象
SELECT 
    JSON_QUERY(value) AS OriginalRowJson
FROM 
    OPENJSON(@json, '$.rows');

为什么这个方法有效?

  • OPENJSON(@json, '$.rows')会直接迭代rows数组里的每一个元素,每个元素对应结果集中的一行。
  • 这里的value字段就是数组中每个元素的原始JSON字符串,用JSON_QUERY包裹它,可以确保SQL Server不会对JSON内容进行转义,直接输出完整的原始对象。

备选方案(适合需要显式定义结构的场景)

如果你的JSON结构可能变化,或者需要显式指定要保留的字段,可以用FOR JSON PATH配合WITHOUT_ARRAY_WRAPPER来重新生成原始JSON:

DECLARE @json NVARCHAR(MAX) = N'{ "rows":[ { "name":"Name1", "attribute1":"attribute1", "attribute2":"attribute2" }, { "name":"Name2", "attribute1":"attribute1", "attribute2":"attribute2" }, { "name":"Name3", "attribute1":"attribute1", "attribute2":"attribute2" } ] }';

SELECT 
    (SELECT 
         name, 
         attribute1, 
         attribute2 
     FROM OPENJSON(value) WITH (
         name NVARCHAR(100),
         attribute1 NVARCHAR(100),
         attribute2 NVARCHAR(100)
     ) 
     FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS OriginalRowJson
FROM 
    OPENJSON(@json, '$.rows');

这个方法会先把每个元素的字段解析出来,再重新序列化为JSON对象,适合需要对字段做筛选或转换的场景。

输出结果示例

不管用哪种方法,最终的输出都会是每行对应一个原始的JSON对象:

{"name":"Name1","attribute1":"attribute1","attribute2":"attribute2"}
{"name":"Name2","attribute1":"attribute1","attribute2":"attribute2"}
{"name":"Name3","attribute1":"attribute1","attribute2":"attribute2"}

内容的提问来源于stack exchange,提问作者TJ_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:57:33