JSON 服务器中使用 OPENJSON 函数的 JSON 数据的路径有问题
Difficulty with PATH for JSON Data in SQL Server using OPENJSON function
我现在正在将 JSON 数据导入 SQL 服务器 table,其中 JSON 数据存储为单个列条目。
我现在有一个更复杂的 JSON 结构,我在路径上遇到了困难
在 OPENJSON 语句中
我尝试创建 table 结果,修改了向我指出的现有 OPENJSON。
但是这条路径我无法让数据出现(命令确实成功完成)
我没有检索 **timestamp 和 value 的数据的路径有什么错误?**
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()
调用来解析它。
我现在正在将 JSON 数据导入 SQL 服务器 table,其中 JSON 数据存储为单个列条目。
我现在有一个更复杂的 JSON 结构,我在路径上遇到了困难 在 OPENJSON 语句中
我尝试创建 table 结果,修改了向我指出的现有 OPENJSON。
但是这条路径我无法让数据出现(命令确实成功完成)
我没有检索 **timestamp 和 value 的数据的路径有什么错误?**
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()
调用来解析它。