【问题标题】:How to create JSON Array Inside JSON object using FOR JSON SQL Server 2016如何使用 FOR JSON SQL Server 2016 在 JSON 对象内创建 JSON 数组
【发布时间】:2017-05-29 11:36:02
【问题描述】:

如何使用 FOR JSON SQL Server 2016(TABLE to JSON)在 JSON 对象内创建 JSON 数组
这是我的查询:

SELECT   
m.MeetingId AS tblMeeting_MeetingId,  
m.Attended AS tblMeeting_Attended, 
m3.CompanyId AS tblMeetingAttendants_CompanyId, 
m3.MeetingAttendantsId AS tblMeetingAttendants_AttendantNameWithTitle, 
m4.UserId AS tblMeetingAttendees_UserId, 
m5.BrokerId AS tblMeetingBroker_BrokerId 
FROM Bv.tblMeeting m 
LEFT JOIN Bv.tblMeetingAttendants m3 ON m.MeetingId = m3.MeetingId  
LEFT JOIN Bv.tblMeetingAttendees m4 ON m.MeetingId = m4.MeetingId  
LEFT JOIN Bv.tblMeetingBroker m5 ON m.MeetingId = m5.MeetingId  
WHERE m.MeetingId = 739 
FOR JSON AUTO, INCLUDE_NULL_VALUES

上面的查询给了我这样的结果:

[
{
    "tblMeeting_MeetingId": 739,
    "tblMeeting_Attended": false,
    "tblMeeting_MeetingSubject": " Benchmark China Internet Analyst",
    "m3": [
        {
            "tblMeetingAttendants_CompanyId": 83,
            "tblMeetingAttendants_AttendantNameWithTitle": 499,
            "m4": [
                {
                    "tblMeetingAttendees_UserId": null,
                    "m5": [
                        {
                            "tblMeetingBroker_BrokerId": 275
                        }
                    ]
                }
            ]
        },
        {
            "tblMeetingAttendants_CompanyId": 83,
            "tblMeetingAttendants_AttendantNameWithTitle": 500,
            "m4": [
                {
                    "tblMeetingAttendees_UserId": null,
                    "m5": [
                        {
                            "tblMeetingBroker_BrokerId": 275
                        }
                    ]
                }
            ]
        },
        {
            "tblMeetingAttendants_CompanyId": 83,
            "tblMeetingAttendants_AttendantNameWithTitle": 501,
            "m4": [
                {
                    "tblMeetingAttendees_UserId": null,
                    "m5": [
                        {
                            "tblMeetingBroker_BrokerId": 275
                        }
                    ]
                }
            ]
        }
    ]
}
]

但我想要这样的结果

[
{
    "tblMeeting_MeetingId": 739,
    "tblMeeting_Attended": false,
    "tblMeeting_MeetingSubject": " Benchmark China Internet Analyst",
    "tblMeetingAttendants_AttendantNameWithTitle": [499,500,501],
    "tblMeetingAttendees_UserId": null,
    "tblMeetingBroker_BrokerId": 275
}
]

请尽快回复
提前致谢。

【问题讨论】:

    标签: sql-server-2016 ssms-2016 sql-server-json


    【解决方案1】:

    如果不使用字符串连接并编写自己的函数,这似乎是不可能的。没有神奇的 JSON_ARRAY_AGGREGATE() 函数。我自己一直在找一个。 这是一个相关的问题:SQL Server 2016 for JSON output integer array

    【讨论】:

      【解决方案2】:

      可以使用 JSON_QUERY 和 JSON PATH 将数据格式化为 JSON 数组。我仅对您的 MeetingID 和 MeetingAttendantID 列进行了抽样以演示该概念

      使用 JSON_QUERY 构建 JSON 数组

      DROP TABLE IF EXISTS #MeetingAttendance
      
      CREATE TABLE #MeetingAttendance (MeetingID INT,AttendantID INT)
      INSERT INTO #MeetingAttendance
      VALUES (739,499)
      ,(739,500)
      ,(739,501)
      
      SELECT tblMeeting_MeetingId = MeetingID
          ,tblMeetingAttendants_AttendantNameWithTitle = JSON_QUERY('['+STRING_AGG(CONCAT('"',AttendantID,'"'),',') + ']')   
      FROM #MeetingAttendance
      GROUP BY MeetingID
      FOR JSON PATH,WITHOUT_ARRAY_WRAPPER 
      

      结果

      {
          "tblMeeting_MeetingId": 739,
          "tblMeetingAttendants_AttendantNameWithTitle": [
              "499",
              "500",
              "501"
          ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        相关资源
        最近更新 更多