问题描述
"table": [
{
"name": "Emergency","columns": [
{
"name": "ab","type": "long"
},{
"name": "cd",{
"name": "ef",{
"name": "gh",],"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)
解决方法
首先你必须从有效的 JSON 开始,然后是这样的:
declare @json nvarchar(max) = N'
{
"table": [
{
"name": "Emergency","columns": [
{
"name": "ab","type": "long"
},{
"name": "cd",{
"name": "ef",{
"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