如何从 SQL 服务器中的 JSON 列中提取数组数据(OPENJSON、JSON_QUERY)

How to extract array data from a JSON Column in SQL Server (OPENJSON, JSON_QUERY)

我们有一个 SQL 服务器 table,它有一个带有 JSON 数据的 varchar(max) 列,但其中一个字段是一个数组。尽我所能,我无法让它每行提取一个。在过去,我设法在每个数组由命名成员组成的地方做到这一点,因此使用另一个 CROSS APPLY WITH (...) 并命名成员。但是正在努力弄清楚如何使用更简单的值列表来做到这一点。

伪代码:

DROP TABLE IF EXISTS #MyTable
CREATE TABLE #MyTable (
  Id uniqueidentifier
  ,MyJsonText nvarchar(max))
INSERT INTO #MyTable(Id, MyJsonText) VALUES
('EDA4A604-59F4-4E4E-9C20-08D82314D8F6', '{"InitialCost":75.0,"OtherCost":50.0,"DatesOfVisit":["Wed, 26 Feb 2020 00:00:00 GMT","Fri, 20 Mar 2020 00:00:00 GMT"],"CatNumber":"PH123456"}')

SELECT ISJSON(MyJsonText) FROM #MyTable -- Check JSON ok

SELECT
  mt.Id
  ,mt_j.InitialCost
  ,mt_j.OtherCost
  ,mt_j.CatNumber
FROM #MyTable mt 
CROSS APPLY OPENJSON(mt.MyJsonText) WITH (
  InitialCost decimal(8,2)
  ,OtherCost decimal(8,2)
  ,CatNumber varchar(50)) as mt_j

上面使用了来自 JSON 的“顶级”数据,但是我如何 return 这个:

Id                                      InitialCost       OtherCost  DatesOfVisit              CatNumber
EDA4A604-59F4-4E4E-9C20-08D82314D8F6    75.00             50.00      Wed, 26 Feb 2020 00:00:00 GMT PH123456
EDA4A604-59F4-4E4E-9C20-08D82314D8F6    75.00             50.00      Fri, 20 Mar 2020 00:00:00 GMT PH123456

非常感谢任何指导!

嵌套您的 JSON 电话:

SELECT MT.Id,
       JT.InitialCost,
       JT.OtherCost,
       DV.value AS DateOfVisit
FROM #MyTable MT
     CROSS APPLY OPENJSON(MT.MyJsonText)
                 WITH (InitialCost decimal(8,2),
                       OtherCost decimal(8,2),
                       DatesOfVisit nvarchar(MAX) AS JSON) JT
     CROSS APPLY OPENJSON(DatesOfVisit) DV;