Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2017的Json输出格式_Json_Sql Server - Fatal编程技术网

SQL Server 2017的Json输出格式

SQL Server 2017的Json输出格式,json,sql-server,Json,Sql Server,我在SQL Server 2017中有一个存储过程,它将结果集输出为JSON。它的作品输出集刚刚好,但我希望它在一个不同的格式 根据微软的文档,它发送的格式和预期的一样,但对我来说似乎有违直觉。我无论如何都不是JSON专家,但我一直认为它是结构的单一对象表示 查询是: SELECT e.EventID AS 'Event.ID', EventDate AS 'Event.Date', ea.ActivityID AS 'Event.Activity.ID', e

我在SQL Server 2017中有一个存储过程,它将结果集输出为JSON。它的作品输出集刚刚好,但我希望它在一个不同的格式

根据微软的文档,它发送的格式和预期的一样,但对我来说似乎有违直觉。我无论如何都不是JSON专家,但我一直认为它是结构的单一对象表示

查询是:

SELECT 
    e.EventID AS 'Event.ID',
    EventDate AS 'Event.Date',
    ea.ActivityID AS 'Event.Activity.ID',
    ea.CreateDate AS 'Event.Activity.Date',
    ea.Notes AS 'Event.Activity.Notes'
FROM
    Events e  
JOIN 
    dbo.EventActivities ea ON e.EventID = ea.EventID
FOR JSON PATH
这将返回以下输出:

[
    {"Event":  { 
                   "ID":"236",
                   "Date":"2019-03-01",
                   "Activity": {"ID": 10,
                                "Date":"2019-01-02T11:47:33.2800000",
                                "Notes":"Event created"}
               }
    },
    {"Event": {
                  "ID":"236",
                  "Date":"2019-03-01",
                  "Activity": {"ID":20,
                               "Date":"2019-01-02T11:47:34.3933333",
                               "Notes":"Staff selected"}
              }
    },
    {"Event": {
                  "ID":"236",
                  "Date":"2019-03-01",
                  "Activity": {"ID":20,
                              "Date":"2019-01-02T11:47:34.3933333",
                              "Notes":"Staff selected"}
              }
     }
]
当我手动格式化时(为了更好地可视化它,它为每个活动提供了一个由3个相同事件组成的数组。这与MS在

我期待(或者更确切地说是希望)看到类似于:

[
    {
        "Event": {
            "ID": "236",
            "Date": "2019-03-01",
            "Activity": [
                {
                    "ID": 10,
                    "Date": "2019-01-02T11:47:33.2800000",
                    "Notes": "Event created"
                },
                {
                    "ID": 20,
                    "Date": "2019-01-02T11:47:34.3933333",
                    "Notes": "Staff selected"
                },
                {
                    "ID": 20,
                    "Date": "2019-01-02T11:47:34.3933333",
                    "Notes": "Staff selected"
                }
            ]
        }
    }
]

有可能得到这样的输出格式吗?或者这是无效的吗?

您预期的输出不是有效的JSON。但是,假设您将活动字段引用为活动数组,则可以使用嵌套查询

SELECT
    E.EventID AS 'Event.ID',
    E.EventDate AS 'Event.Date',
    (
        SELECT
            A.ActivityID AS 'ID',
            A.CreateDate AS 'Date',
            A.Notes AS 'Notes'
        FROM dbo.EventActivities AS A
        WHERE A.EventID = E.EventID
        FOR JSON PATH
    ) AS 'Event.Activities'
FROM dbo.Events AS E
FOR JSON PATH

首先,您可以测试JSON字符串是否对有效。您指示的预期输出未通过验证,但已关闭。内部数组缺少“[]”

不过,我明白你的意思了。为了更好地解释我认为你遇到的问题,我将美化查询输出JSON的格式,以匹配预期的JSON

原始输出如下:

[
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"
            }
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"
            }
        }
    }
]
{"Event":
    [
        {"ID":236,"Date":"2019-03-01",
            "Activity":
                [
                    {"ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
                ]
        }
    ]
}
{"Event":[{"ID":236,"Date":"2019-03-01","Activity":[{"ID":10,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Event created"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"}]}]}
根据您的理想格式,可能的有效JSON字符串如下所示:

[
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"
            }
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"
            }
        }
    }
]
{"Event":
    [
        {"ID":236,"Date":"2019-03-01",
            "Activity":
                [
                    {"ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
                ]
        }
    ]
}
{"Event":[{"ID":236,"Date":"2019-03-01","Activity":[{"ID":10,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Event created"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"}]}]}
您可以通过调整第二个表的表别名并使用and来实现这一点。它将返回一个输出,其中每个“EventActivities”都不重复“Event”属性。对于每个“Event”,它将把其相关的“EventActivities”放入一个数组中

以下SQL将返回所需的输出:

SELECT [Event].EventID AS 'ID',
    [Event].EventDate AS 'Date',
    Activity.ActivityID AS 'ID',
    Activity.CreateDate AS 'Date',
    Activity.Notes AS 'Notes'
FROM #Events [Event]
JOIN #EventActivities Activity
    ON [Event].EventID = Activity.EventID
FOR JSON AUTO, ROOT('Event')
具体输出如下所示:

[
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"
            }
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
        }
    },
    {"Event":
        {"ID":"236","Date":"2019-03-01",
            "Activity":{
                "ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"
            }
        }
    }
]
{"Event":
    [
        {"ID":236,"Date":"2019-03-01",
            "Activity":
                [
                    {"ID":10,"Date":"2019-01-02T11:47:33.2800000","Notes":"Event created"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"},
                    {"ID":20,"Date":"2019-01-02T11:47:34.3933333","Notes":"Staff selected"}
                ]
        }
    ]
}
{"Event":[{"ID":236,"Date":"2019-03-01","Activity":[{"ID":10,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Event created"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"},{"ID":20,"Date":"2019-01-02T11:47:33.2800000Z","Notes":"Staff selected"}]}]}

它不会以美化的格式返回,但可以添加空格和缩进,而不会影响它是有效的JSON,同时也可以达到预期的数组要求。

格式化、空格和缩进通常不属于DB引擎,最好留给程序使用的任何表示层(类似于将日期转换为文本以显示)。对于临时测试,通常只需将输出粘贴到适当的工具中即可,该工具可以为您设置格式,即使有点不方便。您希望看到的不是有效的JSON。在预期的JSON中,活动字段应该是一个数组。修复了预期的JSON格式。非常好的解决方案,谢谢。我读过关于IsJson的内容,但完全忘记了我本可以证明这一点。你建议的格式正是我想要的。在我看来,这是一个比Hector Montero提供的更好的解决方案,纯粹是因为它不使用相关查询。谢谢你们两位的帮助。