【问题标题】:LOOP Through JSON Data and update query in SQL Sever在 SQL Server 中通过 JSON 数据循环和更新查询
【发布时间】:2020-05-26 16:46:05
【问题描述】:

我有一个如下的 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

这里更新查询不起作用。 我正在尝试循环我的 JSON 数据并从 json 数据中获取 CRT_EMAILCRT_FIRST_NAMECRT_ID 值,并基于这些值我试图用 CRT_EMAIL 列更新其各自列的值,即主要键CRT_ID

但更新查询不起作用。这是循环 JSON 数据的正确方法吗?

【问题讨论】:

    标签: sql-server stored-procedures sql-server-2016 sql-server-2016-express


    【解决方案1】:

    只需将 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; 
    

    如果你想遍历 json 数据,你可以使用游标。 EG

    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;
    

    【讨论】:

    • 如果我需要编写 IF ELSE 语句和 Select 语句来传递值以更新查询怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多