0

我必须与接受 JSON 消息但基于动态原理的网络服务交谈。因此,如果想要基于 name\values 属性的动态构建,而不是使用固定定义的字段。

FE

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

使用 SQL 中的 FOR JSON 选项,我得到一个包含列名及其值的结果。铁查询:

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"
        }
    ]
}

我怎样才能达到第一个结果?

4

1 回答 1

0

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

我还将您的代码带入 2000 年代中期,因为sys.sysobjects系统视图是 SQL Server 2000 的兼容性视图(如文档中所述)。现在是 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');
于 2021-11-04T13:08:21.130 回答