SQL Server root + FOR JSON 路径在同一对象中

Jos*_*uiz 2 sql t-sql sql-server json jsonpath

我正在尝试以 JSON 检索一些数据,但是,我正在努力以正确的方式对其进行格式化,以下是一个示例:

CREATE TABLE #test (id int identity(1,1), name varchar(100), EntityType VARCHAR(10))

insert into #test values('Dell','PC')
insert into #test values('Microsoft','CO')
insert into #test values('MAC','PC')
insert into #test values('APPLE','CO')

SELECT * FROM #test WHERE EntityType = 'PC' FOR JSON PATH, ROOT('??')  

drop table #test
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用 root 但没有成功

我正在寻找这个结果,它是一个对象,然后是一个按列分组的数组

{
    "CO": [
      {
          "id": 1,
          "name": "Dell",
      },
      {
          "id": 2,
          "name": "Microsoft",
      },
    ]
    "PC" :[
      {
        "id": 3,
        "name": "MAC",
    },
    {
        "id": 4,
        "name": "APPLE",
    }]
}
Run Code Online (Sandbox Code Playgroud)

Yit*_*sky 5

另一种没有动态 SQL 的方法。

EntityType 级别的根值来自表。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY key, [name] varchar(100), EntityType VARCHAR(10));
INSERT INTO @tbl VALUES
('Dell','PC'),
('Microsoft','CO'),
('MAC','PC'),
('APPLE','CO');
-- DDL and sample data population, end

SELECT CONCAT(
   N'{',
   STUFF(
      (
      SELECT DISTINCT CONCAT(N',"', k.EntityType, '":', c.[Json])
      FROM @tbl AS k
      CROSS APPLY (
         SELECT id, [name]
         FROM @tbl
         WHERE EntityType = k.EntityType
         FOR JSON PATH
      ) c([Json])
      FOR XML PATH('')
      ), 1, 1, N''
   ),  
   N'}'
) AS JsonOutput;
Run Code Online (Sandbox Code Playgroud)

输出

{
    "CO": [
        {
            "id": 2,
            "name": "Microsoft"
        },
        {
            "id": 4,
            "name": "APPLE"
        }
    ],
    "PC": [
        {
            "id": 1,
            "name": "Dell"
        },
        {
            "id": 3,
            "name": "MAC"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)