首页 > 解决方案 > 如何编写 SQL 查询来生成 json 对象内的空 json 对象

问题描述

我需要一个 SQL 查询来获取下面的 JSON 对象。我试过了FOR JSON PATH。Upto Model 对象我可以得到它。但内部 JSON 对象不会出现。

{
  "Model": [
    {
       "ModelName": "Registration",
       "Version": 1,   
       "Student": [
          {
            "StudentID": null,
            "StudentName": null,          
            "Work": [
              {
                "WorkID": null,
                "WorkNameName": null,             
                "Note": [
                  {
                    "NoteID": null,
                    "Comments": null,                 
                    "Visible": [
                       {
                         "IsVisible": null
                       }
                    ]
                  }
                ]
              }
           ]
         }
      ]
    }
  ]
}

标签: sqljsonsql-server-2019

解决方案


定义一个nvarchar(max)变量(它是一个有效的 JSON 对象)始终是一种选择,但您可以尝试SELECT使用FOR JSON AUTO. 在这种情况下,输出 JSON 的结构取决于 SELECT 语句的结构。

陈述:

DECLARE @ScriptData nvarchar(max) 
SET @ScriptData = 
(
   SELECT 
      Model.ModelName, Model.Version, 
      Student.StudentID, Student.StudentName,
      Work.WorkID, Work.WorkNameName,
      Note.NoteID, Note.Comments,
      Visible.IsVisible
   FROM (VALUES ('Registration', 1)) Model (ModelName, Version)   
   CROSS APPLY (VALUES (NULL, NULL)) Student (StudentID, StudentName)
   CROSS APPLY (VALUES (NULL, NULL)) Work (WorkID, WorkNameName)
   CROSS APPLY (VALUES (NULL, NULL)) Note (NoteID, Comments)
   CROSS APPLY (VALUES (NULL)) Visible (IsVisible)
   FOR JSON AUTO, ROOT('Model'), INCLUDE_NULL_VALUES
)

结果:

{
  "Model":[
    {
      "ModelName":"Registration",
      "Version":1,
      "Student":[
        {
          "StudentID":null,
          "StudentName":null,
          "Work":[
            {
              "WorkID":null,
              "WorkNameName":null,
              "Note":[
                {
                  "NoteID":null,
                  "Comments":null,
                  "Visible":[
                    {
                      "IsVisible":null
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

推荐阅读