使用OPENJSON函数在SQL Server中难以获取JSON数据的PATH

我现在将JSON数据导入到SQL Server表中,其中JSON数据存储为单个列条目。

使用OPENJSON函数在SQL Server中难以获取JSON数据的PATH

我现在有一个更复杂的JSON结构,我在使用路径时遇到了困难 在OPENJSON语句中

我尝试创建表结果,修改指向我的现有OPENJSON。

但是,此路径我无法使数据显示(命令确实成功完成了)

我的路径中有什么不正确的地方,我没有检索**时间戳的数据?**

SELECT t.[DATE],j.*
FROM DTReport.Json_synthetic_response_time t
CROSS APPLY OPENJSON(t.log,'$.metrics."builtin:synthetic.browser.visuallyComplete.load".series[2]') WITH (
   [Timestamp] bigint '$[0]',[Value] float '$[1]'
) j

这是JSON文件(为简洁起见删除了几个数据点)

 { 
   "totalCount":1,"nextPageKey":null,"metrics":{ 
      "builtin:synthetic.browser.visuallyComplete.load":{ 
         "series":[ 
            { 
               "dimensions":[ 
                  "SYNTHETIC_TEST-434A9DE59A6CAFD6"
               ],"values":[ 
                  { 
                     "timestamp":1571691600000,"value":2978.5833333333335
                  },{ 
                     "timestamp":1571702400000,"value":3129.6666666666665
                  },{ 
                     "timestamp":1571713200000,"value":3040.6666666666665
                  },{ 
                     "timestamp":1571724000000,"value":3132.1666666666665
                  },{ 
                     "timestamp":1572901200000,"value":2727.2727272727275
                  }
               ]
            }
         ]
      }
   }
}
alexzip 回答:使用OPENJSON函数在SQL Server中难以获取JSON数据的PATH

您需要先解析series JSON数组(在您的情况下只有一项),然后再解析values JSON数组,并附加APPLY运算符和OPENJSON()调用。

JSON:

DECLARE @json nvarchar(max) = N'{ 
   "totalCount":1,"nextPageKey":null,"metrics":{ 
      "builtin:synthetic.browser.visuallyComplete.load":{ 
         "series":[ 
            { 
               "dimensions":[ 
                  "SYNTHETIC_TEST-434A9DE59A6CAFD6"
               ],"values":[ 
                  { 
                     "timestamp":1571691600000,"value":2978.5833333333335
                  },{ 
                     "timestamp":1571702400000,"value":3129.6666666666665
                  },{ 
                     "timestamp":1571713200000,"value":3040.6666666666665
                  },{ 
                     "timestamp":1571724000000,"value":3132.1666666666665
                  },{ 
                     "timestamp":1572901200000,"value":2727.2727272727275
                  }
               ]
            }
         ]
      }
   }
}'

表格:

CREATE TABLE JSON_TEST (DATE date,[log] nvarchar(max))
INSERT INTO JSON_TEST (DATE,[log]) 
VALUES (GETDATE(),@json)

声明:

SELECT d.[DATE],j.*
FROM JSON_TEST d
CROSS APPLY OPENJSON(d.log,'$.metrics."builtin:synthetic.browser.visuallyComplete.load".series[0].values') WITH (
   [Timestamp] bigint '$.timestamp',[Value] float '$.value'
) j

结果:

DATE                    Timestamp   Value
05/11/2019 00:00:00 1571691600000   2978.58333333333
05/11/2019 00:00:00 1571702400000   3129.66666666667
05/11/2019 00:00:00 1571713200000   3040.66666666667
05/11/2019 00:00:00 1571724000000   3132.16666666667
05/11/2019 00:00:00 1572901200000   2727.27272727273

注意:

如果series JSON数组具有多个项目,则需要使用额外的OPENJSON()调用来解析它。

,

您的with clause中的column_path必须是有效的JSON Path Expression。我认为以下内容将您从series[2]更改为series[0]可以满足您的要求。

DECLARE @json NVARCHAR(MAX) = '{ 
   "totalCount":1,"value":2727.2727272727275
                  }
               ]
            }
         ]
      }
   }
}'

SELECT * 
FROM OPENJSON(@json,'$.metrics."builtin:synthetic.browser.visuallyComplete.load".series[0].values') 
WITH (
   [Timestamp] bigint '$.timestamp',[Value] float '$.value'
) j

您可能会发现有用的另一个选项是将JSON结构分解为多个部分,因此您不必在series数组中引用特定索引:

SELECT v.* 
FROM OPENJSON(@json,'$.metrics."builtin:synthetic.browser.visuallyComplete.load"') WITH (Series NVARCHAR(MAX) '$.series' AS JSON) j
CROSS APPLY OPENJSON (j.Series) WITH ([Values] NVARCHAR(MAX) '$.values' AS JSON) s
CROSS APPLY OPENJSON (s.[Values]) WITH ([Timestamp] bigint '$.timestamp',[Value] float '$.value') v
本文链接:https://www.f2er.com/3162746.html

大家都在问