在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_
相关产品推荐
相关产品推荐

