在 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