0
    "table":  [
                   {
                       "name":  "Emergency",
                       "columns":  [
                                       {
                                           "name":  "ab",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "cd",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "ef",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "gh",
                                           "type":  "long"
                                       },
                                       
                                   ],
                       "rows":  [
                                    [                                                                             
                                        0.55865,
                                        2.0966,
                                        0.4280,
                                        1.4389
                                    ],
                                    [
                                        
                                        0.42490,
                                        1.5723,
                                        0.3601,
                                        0.8031
                                    ]
                                ]
                   }
               ]
}

所以在这个 json 中,行内的数组对象可以是多个(超过 2 个)。那么如何使用 OPENJSON SQL Server 函数计算数组 sinde 'rows' 的对象。

我所做的是,将此json存储到临时表#TempAb中,然后

 DECLARE @ab VARCHAR(MAX);
 DECLARE @cd VARCHAR(MAX);
 DECLARE @ef VARCHAR(MAX);
 DECLARE @gh VARCHAR(MAX);
SELECT @ab=ab,@cd=cd,@ef=ef,@gh=gh from #TempAb as ab CROSS APPLY
                            OPENJSON(ab.RawData, '$.table') WITH
                            (
                            ab Varchar(MAX) '$.rows[0][0],
                            cd Varchar(Max) '$.rows[0][1],
                            ef Varchar(Max) '$.rows[0][2],
                            gh Varchar(Max) '$.rows[0][3]
);                 

所以这个查询只返回行的第一个对象的数据,但我想要所有行对象的数据。所以我知道计数然后在while循环中迭代它

解决方案:


SET @cnt_total = (SELECT  COUNT(O.[key]) FROM (VALUES(@jsonvalue))V(J)
                                CROSS APPLY OPENJSON(V.J)
                                WITH([Object] nvarchar(MAX) '$.table[0].rows' AS JSON) M
                                CROSS APPLY OPENJSON(M.[Object]) O) 
4

1 回答 1

0

首先你必须从有效的 JSON 开始,然后是这样的:

declare @json nvarchar(max) = N'
{
    "table":  [
                   {
                       "name":  "Emergency",
                       "columns":  [
                                       {
                                           "name":  "ab",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "cd",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "ef",
                                           "type":  "long"
                                       },
                                       {
                                           "name":  "gh",
                                           "type":  "long"
                                       }
                                       
                                   ],
                       "rows":  [
                                    [                                                                             
                                        0.55865,
                                        2.0966,
                                        0.4280,
                                        1.4389
                                    ],
                                    [
                                        
                                        0.42490,
                                        1.5723,
                                        0.3601,
                                        0.8031
                                    ]
                                ]
                   }
               ]
}
'


select count(*) from 
OPENJSON(@json, '$.table[0].rows') d
于 2021-01-05T23:52:42.293 回答