如何在 TSQL FOR JSON 选项中拆分列 headers 和值?

How to split column headers & values in TSQL FOR JSON Option?

我必须与接受 JSON-messages 但基于动态原理的 Web 服务对话。因此,如果想要基于 name\values 属性的动态构建,而不是使用固定定义的字段。

F.E.

{
    "Begin": [
        {
            "name": "sysrscols",
            "value": "sysrscols"
        },
        {
            "name": "id",
            "value": "3"
        },
        {
            "name": "crdate",
            "value": "2013-03-22T15:06:57.220"
        }
    ]
}

使用 SQL 中的 FOR JSON 选项,我得到了包含列名及其值的结果。 F.e。 查询:

SELECT TOP 1 so.name,so.id,so.crdate  From sysobjects so FOR JSON PATH, Root('Begin')

给出结果:

{
    "Begin": [
        {
            "name": "sysrscols",
            "id": 3,
            "crdate": "2013-03-22T15:06:57.220"
        }
    ]
}

如何才能达到第一个结果?

您需要在此处取消数据透视,然后使用 FOR JSON。我在这里使用 dirty 解决方案并将值转换为 sql_variant;我建议你不要这样做。取而代之的是 CONVERT (n)varchar 的值,并在需要的地方使用适当的样式代码来获得您想要的“格式”。

我还将您的代码带入 2000 年代中期,因为 sys.sysobjects 系统视图是 SQL Server 2000 的兼容性视图(如 documentation 中所述)。现在是 2021 年,我觉得您开始使用“新”系统对象已经很久了:

SELECT V.name,
       V.value
FROM sys.objects so
     CROSS APPLY (VALUES(CONVERT(sql_variant,so.name),N'name'),
                        (CONVERT(sql_variant,so.object_id),N'object_id'),
                        (CONVERT(sql_variant,so.create_date), N'createdate'))V([value],[name])
WHERE so.[name] = 'SomeView' --This would be the object you want
FOR JSON PATH, ROOT('Begin');