L OOP Через JSON Запрос данных и обновления на SQL сервере - PullRequest
0 голосов
/ 26 мая 2020

У меня есть массив JSON, как показано ниже

    [
      {
        "CRT_FIRST_NAME": "abc",
        "CRT_EMAIL": "abc@gmail.com",
        "CRT_ID": 60
      },
      {
        "CRT_FIRST_NAME": "pqr",
        "CRT_EMAIL": "pqr@gmail.com",
        "CRT_ID": 61
      },
      {
        "CRT_FIRST_NAME": "sample",
        "CRT_EMAIL": "sample@gmail.com",
        "CRT_ID": 62
      }
    ]

Я передаю его и выполняю хранимую процедуру save_employee_data, как показано ниже

 exec save_employee_data '[{"CRT_FIRST_NAME": "abc","CRT_EMAIL": "abc@gmail.com","CRT_ID": 60},{"CRT_FIRST_NAME": "pqr","CRT_EMAIL": "pqr@gmail.com","CRT_ID": 61},{"CRT_FIRST_NAME": "sample","CRT_EMAIL": "sample@gmail.com","CRT_ID": 62}]'

И моя хранимая процедура выглядит как ниже

    CREATE PROCEDURE [dfed].[save_employee_data] 
    @jsondata nvarchar(max)
    AS
    DECLARE

    @CRTID_FETCH INT,
    @CRT_FIRST_NAME_FETCH  VARCHAR(250),
    @CRT_EMAIL_FETCH VARCHAR(250)

    BEGIN
        SELECT @CRT_FIRST_NAME_FETCH=CRT_FIRST_NAME, @CRT_EMAIL_FETCH=CRT_EMAIL, @CRTID_FETCH=CRT_ID FROM  
         OPENJSON ( @jsondata )  
        WITH (   
                      CRT_FIRST_NAME   varchar(200) '$.CRT_FIRST_NAME' ,
                      CRT_EMAIL varchar(200) '$.CRT_EMAIL',
                      CRT_ID varchar(200) '$.CRT_ID'
         ) 

        UPDATE employees SET email_staff = @CRT_EMAIL_FETCH WHERE CRT_ID = @CRTID_FETCH
    END

Здесь запрос на обновление не работает. Я пытаюсь l oop my JSON data и извлекаю значения CRT_EMAIL, CRT_FIRST_NAME, CRT_ID из данных json, и на основе этих значений я пытаюсь обновить столбец email_staff с помощью CRT_EMAIL значение для соответствующего столбца, т.е. первичный ключ CRT_ID

Но запрос на обновление не работает. Это правильный способ зацикливания JSON данных?

1 Ответ

1 голос
/ 26 мая 2020

Просто присоедините данные JSON к таблице employees и обновите результаты. Как это

with n as
(
      SELECT CRT_FIRST_NAME, CRT_EMAIL, CRT_ID 
      FROM OPENJSON ( @jsondata )  
         WITH (   
                CRT_FIRST_NAME   varchar(200) '$.CRT_FIRST_NAME' ,
                CRT_EMAIL varchar(200) '$.CRT_EMAIL',
                CRT_ID varchar(200) '$.CRT_ID'
              ) 
), q as
(
   select n.CRT_EMAIL, e.email_staff , e.crt_id
   from n 
   join employees e
     on n.CRT_ID = e.CRT_ID
)
--select * from q;
update q set email_staff = CRT_EMAIL; 

Если вы хотите l oop поверх данных json, вы можете использовать курсор. Например,

DECLARE C CURSOR LOCAL FOR 
    SELECT CRT_FIRST_NAME, CRT_EMAIL, CRT_ID 
    FROM  OPENJSON ( @jsondata )  
    WITH (   
                  CRT_FIRST_NAME   varchar(200) '$.CRT_FIRST_NAME' ,
                  CRT_EMAIL varchar(200) '$.CRT_EMAIL',
                  CRT_ID varchar(200) '$.CRT_ID'
     ); 
OPEN C;

FETCH NEXT FROM C INTO  @CRT_FIRST_NAME, @CRT_EMAIL, @CRT_ID; 
WHILE @@FETCH_STATUS = 0      
BEGIN

    UPDATE employees SET email_staff = @CRT_EMAIL WHERE CRT_ID = @CRT_ID;

    FETCH NEXT FROM C INTO  @CRT_FIRST_NAME, @CRT_EMAIL, @CRT_ID;                 
END

CLOSE C;
DEALLOCATE C;
...