JSON 服务器中使用 OPENJSON 函数的 JSON 数据的路径有问题

Difficulty with PATH for JSON Data in SQL Server using OPENJSON function

我现在正在将 JSON 数据导入 SQL 服务器 table,其中 JSON 数据存储为单个列条目。

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

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

但是这条路径我无法让数据出现(命令确实成功完成)

我没有检索 **timestampvalue 的数据的路径有什么错误?**

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
                  }
               ]
            }
         ]
      }
   }
}

你的 with clause needs to be a valid JSON Path Expression 中的 column_path。我认为以下通过从 series[2]series[0] 的更改可以满足您的要求。

DECLARE @json NVARCHAR(MAX) = '{ 
   "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
                  }
               ]
            }
         ]
      }
   }
}'

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

您可能会发现另一个有用的选项是将 JSON 结构分解为多个部分,这样您就不必引用系列数组中的特定索引:

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

您需要解析 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
                  }
               ]
            }
         ]
      }
   }
}'

Table:

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() 调用来解析它。