在 SQL Server 2016 中循环 JSON
Loop through JSON in SQL Server 2016
我有一个关注者JSON
{
"href": {
"host": "localhost",
"port": 2222
},
"name": "20190812",
"scheduledStartTime": "2019-08-12T12:22:52.500-04:00",
"parameters": {
"1251226": {
"value": {
"instanceID": 219002,
"productName": "product1",
"userID": "admin"
}
},
"1251287": {
"value": {
"sgName": "sg1",
"userID": "admin"
}
}
}
}
我想遍历 JSON 并逐个处理每次迭代。
我尝试使用 While giving the length of JSON as count,但无法弄清楚如何一个一个地获取值
在 SQL Server 2016 中甚至可能吗?
到目前为止我试过了
Declare @count INT
select @count = COUNT(*)
FROM OPENJSON((select template_data_mapping from template_data_mapping), N'$')
WHILE @count != 0
BEGIN
SELECT @count
SET @count = @count - 1;
END;
不清楚您为什么 ...想要遍历 JSON 并逐个处理每次迭代... 使用 WHILE
循环,但是一种可能的基于集合的方法来解析这个 JSON 是使用内置的 JSON 支持:
JSON:
DECLARE @json nvarchar(max) = N'{
"href": {
"host": "localhost",
"port": 2222
},
"name": "20190812",
"scheduledStartTime": "2019-08-12T12:22:52.500-04:00",
"parameters": {
"1251226": {
"value": {
"instanceID": 219002,
"productName": "product1",
"userID": "admin"
}
},
"1251287": {
"value": {
"sgName": "sg1",
"userID": "admin"
}
}
}
}'
声明:
SELECT
j1.host, j1.port, j1.scheduledStartTime,
j2.[key] AS parameter,
j3.[key], j3.[value]
FROM OPENJSON(@json) WITH (
host varchar(100) '$.href.host',
port int '$.href.port',
name varchar(100) '$.name',
scheduledStartTime varchar(30) '$.scheduledStartTime',
parameters nvarchar(max) '$.parameters' AS JSON
) j1
OUTER APPLY OPENJSON(j1.parameters, '$') j2
OUTER APPLY OPENJSON(j2.[value], '$.value') j3
结果:
host port scheduledStartTime parameter key value
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 instanceID 219002
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 productName product1
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 userID admin
localhost 2222 2019-08-12T12:22:52.500-04:00 1251287 sgName sg1
localhost 2222 2019-08-12T12:22:52.500-04:00 1251287 userID admin
我有一个关注者JSON
{
"href": {
"host": "localhost",
"port": 2222
},
"name": "20190812",
"scheduledStartTime": "2019-08-12T12:22:52.500-04:00",
"parameters": {
"1251226": {
"value": {
"instanceID": 219002,
"productName": "product1",
"userID": "admin"
}
},
"1251287": {
"value": {
"sgName": "sg1",
"userID": "admin"
}
}
}
}
我想遍历 JSON 并逐个处理每次迭代。 我尝试使用 While giving the length of JSON as count,但无法弄清楚如何一个一个地获取值
在 SQL Server 2016 中甚至可能吗?
到目前为止我试过了
Declare @count INT
select @count = COUNT(*)
FROM OPENJSON((select template_data_mapping from template_data_mapping), N'$')
WHILE @count != 0
BEGIN
SELECT @count
SET @count = @count - 1;
END;
不清楚您为什么 ...想要遍历 JSON 并逐个处理每次迭代... 使用 WHILE
循环,但是一种可能的基于集合的方法来解析这个 JSON 是使用内置的 JSON 支持:
JSON:
DECLARE @json nvarchar(max) = N'{
"href": {
"host": "localhost",
"port": 2222
},
"name": "20190812",
"scheduledStartTime": "2019-08-12T12:22:52.500-04:00",
"parameters": {
"1251226": {
"value": {
"instanceID": 219002,
"productName": "product1",
"userID": "admin"
}
},
"1251287": {
"value": {
"sgName": "sg1",
"userID": "admin"
}
}
}
}'
声明:
SELECT
j1.host, j1.port, j1.scheduledStartTime,
j2.[key] AS parameter,
j3.[key], j3.[value]
FROM OPENJSON(@json) WITH (
host varchar(100) '$.href.host',
port int '$.href.port',
name varchar(100) '$.name',
scheduledStartTime varchar(30) '$.scheduledStartTime',
parameters nvarchar(max) '$.parameters' AS JSON
) j1
OUTER APPLY OPENJSON(j1.parameters, '$') j2
OUTER APPLY OPENJSON(j2.[value], '$.value') j3
结果:
host port scheduledStartTime parameter key value
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 instanceID 219002
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 productName product1
localhost 2222 2019-08-12T12:22:52.500-04:00 1251226 userID admin
localhost 2222 2019-08-12T12:22:52.500-04:00 1251287 sgName sg1
localhost 2222 2019-08-12T12:22:52.500-04:00 1251287 userID admin