在 SQL Server 2016 中循环 JSON

Posted

技术标签:

【中文标题】在 SQL Server 2016 中循环 JSON【英文标题】:Loop through JSON in SQL Server 2016 【发布时间】:2020-03-03 07:17:32 【问题描述】:

我有以下 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 将 JSON 的长度作为计数,但无法弄清楚如何逐个获取值

在 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;

【问题讨论】:

到目前为止你尝试了什么??预期的输出是什么?? 您希望从每次迭代中获得什么数据——可能是来自parameters JSON 数组的值?如果是这样,你想用这些值做什么? 【参考方案1】:

不清楚您为什么...想要遍历 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   

【讨论】:

以上是关于在 SQL Server 2016 中循环 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 for 循环将多条记录插入 SQL Server 数据库

在javascript中循环遍历python-dictionary-turned-into-json

在sql server中循环语句 for要怎么使用

SQL Server - 读取第一行并删除

使用 PDO 驱动程序 PHP 在 sql-server 查询中循环

sql server中do while循环怎么写