0

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

MSSQL 行条目

我现在有一个更复杂的 JSON 结构,并且在 OPENJSON 语句中的路径有困难

我尝试创建表结果来修改向我指出的现有 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
                  }
               ]
            }
         ]
      }
   }
}
4

2 回答 2

1

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

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

笔记:

如果seriesJSON 数组包含多个项目,则需要通过额外OPENJSON()调用对其进行解析。

于 2019-11-05T06:53:42.547 回答
0

column_path你的with子句必须是有效的JSON Path Expressionseries[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
于 2019-11-05T03:24:15.283 回答