L oop до JSON in SQL Server 2016 - PullRequest
1 голос
/ 03 марта 2020

У меня есть следующее 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;

1 Ответ

0 голосов
/ 03 марта 2020

Непонятно, почему вы ... хотите перебрать JSON и обработать каждую итерацию одну за другой ... , используя WHILE l oop, но один возможный набор Основанный на анализе 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   
...