首页 > 解决方案 > SQL Server 2016 中的 FOR JSON

问题描述

有什么方法可以在 SQL Server 2016 中使用 FOR JSON 返回以下给定格式的 JSON 数据?

 { 
     "draw": 1, 
     "recordsTotal": 57, 
     "recordsFiltered": 57, 
     "data": 
     [ 
         {
         "first_name": "Airi", 
         "last_name": "Satou", 
         "position": "Accountant",
         "office": "Tokyo", 
         "start_date": "28th Nov 08", 
         "salary": "$162,700" 
         } 
     ]
 }

尝试了以下查询。但没有得到想要的输出 -

SELECT
    1 AS draw
    ,100 AS recordsTotal
    ,10 AS recordsFiltered
,(SELECT 
    first_name
    ,last_name
    ,position
    ,office
    ,start_date
    ,salary
FROM Employees
FOR JSON PATH,ROOT('Employees'),INCLUDE_NULL_VALUES)

下面给出的查询正确地给出了输出,但无法将列“draw”、“recordsFiltered”和“totalRows”附加到 JSON -

SELECT 
        first_name
        ,last_name
        ,position
        ,office
        ,start_date
        ,salary
    FROM Employees
    FOR JSON PATH,ROOT('Employees'),INCLUDE_NULL_VALUES

标签: sqljsonsql-servertsqlsql-server-2016

解决方案


这应该与虚拟表源完全相同sys.objects(顺便说一句:始终尝试通过提供带有一些数据的表或使用每个人都可以使用的通用系统表来创建一个工作的独立示例)

SELECT
     1 AS draw
    ,100 AS recordsTotal
    ,10 AS recordsFiltered
,(
    SELECT TOP 3
     o.object_id
    ,o.name
    FROM sys.objects o
    FOR JSON PATH,INCLUDE_NULL_VALUES
  ) AS [data]
FOR JSON PATH;

内部SELECT将创建一个对象数组并调用它"data"。外部SELECT将把所有这些放在一起。

结果

[  
   {  
      "draw":1,
      "recordsTotal":100,
      "recordsFiltered":10,
      "data":[  
         {  
            "object_id":3,
            "name":"sysrscols"
         },
         {  
            "object_id":5,
            "name":"sysrowsets"
         },
         {  
            "object_id":6,
            "name":"sysclones"
         }
      ]
   }
]

暗示

您可能想阅读WITHOUT_ARRAY_WRAPPER来控制数组括号...


推荐阅读