SQL使用多个CROSS APPLY解析JSON字段展开单行数据咨询
问题原因
你写的查询存在两个会导致执行失败的问题:
- 第一个
CROSS APPLY子句末尾多余的分号会截断SQL语句,造成语法错误,后续的第二个CROSS APPLY逻辑无法和前面的查询关联。 - 你给出的示例
line_data字段值存在JSON格式错误:"cost": "0.50"'位置多了一个冗余单引号,合法格式应为[{"products": "apple", "cost": "0.50"}],存储的JSON格式非法时OPENJSON会直接抛出解析错误。 - 额外注意:不要直接用
table作为表名,table是SQL保留关键字,直接使用会触发语法错误。
正确实现方式
如果你的shipping_data和line_data字段存储的都是单元素JSON数组,去掉多余分号即可得到「所有字段展开到同一行」的结果,代码如下:
SELECT t.id, A.*, B.* FROM your_table t -- 替换为实际业务表名 CROSS APPLY OPENJSON(t.[shipping_data]) WITH ( name nvarchar(max), Address nvarchar(max) ) A CROSS APPLY OPENJSON(t.[line_data]) WITH ( products nvarchar(max), cost nvarchar(max) ) B;
执行后返回的结果列包含id、name、Address、products、cost,所有字段在同一行展示,完全匹配需求。
多元素数组场景适配
如果两个JSON数组中存储了多条记录(比如一条订单对应多个收货地址、多个商品),直接用CROSS APPLY会返回两个数组元素的笛卡尔积(比如2个收货地址+3个商品会返回6行组合结果)。如果业务上两个数组的元素是按顺序一一对应的,可以通过OPENJSON返回的数组下标做关联,避免出现多余的组合行,写法如下:
SELECT t.id, A.name, A.Address, B.products, B.cost FROM your_table t CROSS APPLY OPENJSON(t.[shipping_data]) WITH ( name nvarchar(max), Address nvarchar(max), array_idx int '$' -- 取当前元素的数组下标 ) A CROSS APPLY OPENJSON(t.[line_data]) WITH ( products nvarchar(max), cost nvarchar(max), array_idx int '$' ) B WHERE A.array_idx = B.array_idx; -- 按下标匹配对应记录
内容的提问来源于stack exchange,提问作者apolloSN
相关产品推荐
相关产品推荐

