Azure Synapse无服务器SQL中嵌套JSON元素Outcomes解析为NULL的原因
问题原因分析
- Outcomes字段返回NULL的原因:在
OPENJSON的WITH子句中,若要映射的JSON元素是数组或嵌套JSON对象,必须添加AS JSON关键字,否则SQL Server无法将数组序列化为字符串,会直接返回NULL。你的代码里Outcomes VARCHAR(MAX) '$.Outcomes'未添加该关键字,导致无法正确解析数组。 - OutcomeId字段返回NULL的原因:
Outcomes是JSON数组,$.Outcomes.OutcomeId的路径写法错误——数组元素必须通过索引(如$.Outcomes[0].OutcomeId)访问单条数据,或通过嵌套OPENJSON遍历整个数组,直接用数组路径加属性名无法获取有效值。
修正后的示例代码
方式1:获取完整Outcomes数组并遍历解析子元素
DECLARE @json VARCHAR(MAX); SET @json = '[{"EntityId":25023,"MethodId":1,"Outcomes":[{"OutcomeId":50043,"OutcomeTypeId":1},{"OutcomeId":50044,"OutcomeTypeId":2}]}]'; SELECT EntityId, MethodId, Outcomes, OutcomeId FROM OPENJSON(@json) WITH ( EntityId INT 'strict $.EntityId', MethodId INT '$.MethodId', Outcomes VARCHAR(MAX) '$.Outcomes' AS JSON -- 添加AS JSON关键字 ) CROSS APPLY OPENJSON(Outcomes) WITH ( OutcomeId INT '$.OutcomeId' -- 嵌套解析数组元素 );
方式2:通过索引获取数组指定位置的元素
如果仅需数组中某一位置的OutcomeId,可使用索引路径:
DECLARE @json VARCHAR(MAX); SET @json = '[{"EntityId":25023,"MethodId":1,"Outcomes":[{"OutcomeId":50043,"OutcomeTypeId":1},{"OutcomeId":50044,"OutcomeTypeId":2}]}]'; SELECT * FROM OPENJSON(@json) WITH ( EntityId INT 'strict $.EntityId', MethodId INT '$.MethodId', Outcomes VARCHAR(MAX) '$.Outcomes' AS JSON, FirstOutcomeId INT '$.Outcomes[0].OutcomeId', -- 获取数组第一个元素的OutcomeId SecondOutcomeId INT '$.Outcomes[1].OutcomeId' -- 获取数组第二个元素的OutcomeId );
内容的提问来源于stack exchange,提问作者user2197446
相关产品推荐
相关产品推荐

