【问题标题】:How to convert json data to records and insert into a using in sql server如何将json数据转换为记录并插入到sql server中的使用中
【发布时间】:2019-03-15 10:37:34
【问题描述】:

我是 sqlserver 的新手。我想将 json 数据转换为记录并插入到表中。 我有类似的json数据

    {  
   "HEADER":[  
      {  
         "seq_id":343,
         "max_processed_scn":649044274,
         "time_processed":"13-MAR-19 09.03.23.081055 PM",
         "status":"COMPLETED"
      },
      {  
         "seq_id":344,
         "max_processed_scn":649214903,
         "time_processed":"15-MAR-19 12.49.31.606172 PM",
         "status":"COMPLETED"
      }
   ],
   "DETAIL":[  
      {  
         "seq_id":11215,
         "event_id":1,
         "caller_seq":343,
         "event_description":"BEGIN.."
      },
      {  
         "seq_id":11216,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTING"
      },
      {  
         "seq_id":11217,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTED "
      } "event_description":"TOTAL"

   ]
   }

所以我想将数组“标题”插入到一个表中,将另一个数组“详细信息”插入到另一个表中。任何人都可以帮助我实现这一目标。在此先感谢

所以我需要像这样的详细表数据

seq_id  max_processed_scn        time_processed               status
343      649044274          13-MAR-19 09.03.23.081055 PM    COMPLETED
344      649214903          15-MAR-19 12.49.31.606172 PM    COMPLETED

我使用了这个查询:

   DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[{  
   "HEADER":[  
      {  
         "seq_id":343,
         "max_processed_scn":649044274,
         "time_processed":"13-MAR-19 09.03.23.081055 PM",
         "status":"COMPLETED"
      },
      {  
         "seq_id":344,
         "max_processed_scn":649214903,
         "time_processed":"15-MAR-19 12.49.31.606172 PM",
         "status":"COMPLETED"
      }
   ],
   "DETAIL":[  
      {  
         "seq_id":11215,
         "event_id":1,
         "caller_seq":343,
         "event_description":"BEGIN.."
      },
      {  
         "seq_id":11216,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTING"
      },
      {  
         "seq_id":11217,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTED "
      } "event_description":"TOTAL"

   ]
   }
 ]'
SELECT *  
FROM OPENJSON(@json, '$.HEADER')  
  WITH (seq_id INT, max_processed_scn INT, time_processed NVARCHAR(100), [status] NVARCHAR(100)) 

【问题讨论】:

  • 假设您使用的是 SQL Server 2016/2017?显示您希望数据在 SQL Server 中的样子会有所帮助。另外,到目前为止,您尝试过什么?
  • 如果你有 SQL Server 2016+,这可以通过OPENJSON 轻松实现(例如SELECT * FROM OPENJSON(@json, '$.HEADER') WITH (seq_id INT, max_processed_scn INT, time_processed NVARCHAR(100), [status] NVARCHAR(100)) 和另一个DETAIL)。如果你不这样做,那么在 T-SQL 中几乎不值得这样做;客户端代码装备精良。
  • 在@pythonCoder 的帖子中展示您的尝试。那里的代码不可读。我已经为您添加了 SQL Server 2017 标记,因为这在这里非常重要。
  • @pythonCoder 添加您尝试过的内容以及您的问题中的问题,而不是 cmets
  • @pythonCoder 顺便说一句,您发布的 JSON 字符串没有 HEADERS 属性。它是一个包含HEADERDETAIL 属性的对象。那些包含数组。至少您需要修复名称并访问数组元素

标签: json sql-server sql-server-2017


【解决方案1】:

您可以在 sql server 2016 及更高版本中使用以下查询来读取 Json 数据并插入所需的表中

样本数据

declare @json varchar(max) =' {  
   "HEADER":[  
      {  
         "seq_id":343,
         "max_processed_scn":649044274,
         "time_processed":"13-MAR-19 09.03.23.081055 PM",
         "status":"COMPLETED"
      },
      {  
         "seq_id":344,
         "max_processed_scn":649214903,
         "time_processed":"15-MAR-19 12.49.31.606172 PM",
         "status":"COMPLETED"
      }
   ],
   "DETAIL":[  
      {  
         "seq_id":11215,
         "event_id":1,
         "caller_seq":343,
         "event_description":"BEGIN.."
      },
      {  
         "seq_id":11216,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTING"
      },
      {  
         "seq_id":11217,
         "event_id":2,
         "caller_seq":343,
         "event_description":"STARTED "
      } 

   ]
   }
   '

查询以选择 Header 数据

  SELECT * FROM OPENJSON(@json, '$.HEADER') WITH (seq_id INT, max_processed_scn INT, time_processed NVARCHAR(50), [status] NVARCHAR(50))

查询以选择详细数据

SELECT * FROM OPENJSON(@json, '$.DETAIL') WITH (seq_id INT, event_id INT, caller_seq int, event_description NVARCHAR(255))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多