Dynami c Обновление JSON В SQL Сервер - PullRequest
1 голос
/ 23 марта 2020

У одного из столбцов, которые у меня есть, есть такие значения. Если у моего JSON есть ключ id , тогда обновите его значение до нового, если у моего JSON JSON есть ключ рабочая нагрузка , затем обновите его значение до нового. есть несколько записей для обновления с новыми значениями.

В настоящее время я пытаюсь l oop в таблицу, анализируя одно значение JSON за раз. Я пытался использовать операторы CASE.

BEGIN
    SET @MyCursor = CURSOR FOR
    select key_value  from @Template
        where key_type = 5

    OPEN @MyCursor 
    FETCH NEXT FROM @MyCursor 
    INTO @MyField

    WHILE @@FETCH_STATUS = 0
    BEGIN

      update @Template
      set key_value =
      case 
      when 'id' in (select [key] from openjson(@MyField))
      then 
        JSON_MODIFY(@MyField, '$.id', '1')

      when 'workload' in (select [key] from openjson(@MyField))
      then 
        JSON_MODIFY(@MyField, '$.workload', '5')

      ELSE '3'
      END 
      -- Fetch next
      FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END; 
    CLOSE @MyCursor ;
    DEALLOCATE @MyCursor;
END;

Это дает следующий результат:

enter image description here

Пожалуйста, подскажите, что я сделал не так

1 Ответ

1 голос
/ 23 марта 2020

Если я правильно понимаю вопрос, вам не нужен курсор, просто обновите операторы:

Таблица:

CREATE TABLE Data (
   key_index int,
   key_value nvarchar(max)
)
INSERT INTO Data
   (key_index, key_value)
VALUES
   (0, N'{"id": 219002, "name": "provider", "protokol": "htpps"}'),
   (1, N'{"srp": "srp", "workload": "2"}')

Оператор с несколькими обновлениями:

UPDATE d
SET d.key_value = JSON_MODIFY(d.key_value, '$.id', 1)
FROM Data d
CROSS APPLY OPENJSON(d.key_value) j
WHERE j.[key] = 'id'
UPDATE d
SET d.key_value = JSON_MODIFY(d.key_value, '$.workload', '5')
FROM Data d
CROSS APPLY OPENJSON(d.key_value) j
WHERE j.[key] = 'workload'

-- or

UPDATE Data
SET key_value = JSON_MODIFY(
    key_value, 
    '$.id', 
    CASE WHEN JSON_VALUE(key_value, 'lax $.id') IS NOT NULL THEN 2 END
)
UPDATE Data
SET key_value = JSON_MODIFY(
    key_value, 
    '$.workload', 
    CASE WHEN JSON_VALUE(key_value, 'lax $.workload') IS NOT NULL THEN '5' END
)

Оператор с вложенными JSON_MODIFY() вызовами:

UPDATE Data
SET 
   key_value = JSON_MODIFY(
      JSON_MODIFY(
         key_value, 
         '$.id', 
         CASE WHEN JSON_VALUE(key_value, 'lax $.id') IS NOT NULL THEN 2 END
      ),
      '$.workload', 
      CASE WHEN JSON_VALUE(key_value, 'lax $.workload') IS NOT NULL THEN '5' END
   )   

Результат:

key_index   key_value
0           {"id": 1, "name": "provider", "protokol": "htpps"}
1           {"srp": "srp", "workload": "5"}
...