1

我有一个以下 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 并一个一个地处理每个迭代。我尝试使用虽然将 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;
4

1 回答 1

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   
于 2020-03-03T08:39:58.843 回答