【问题标题】:How to split column headers & values in TSQL FOR JSON Option?如何在 SQL FOR JSON 选项中拆分列标题和值?
【发布时间】:2021-11-04 12:56:13
【问题描述】:

我必须与接受 JSON 消息但基于动态原理的网络服务交谈。因此,如果想要基于 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"
        }
    ]
}

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

【问题讨论】:

  • 仅供参考,正如documentation 告诉你的那样,你真的不应该再使用像sys.sysobjects 这样的对象了;它更多是为了与 SQL Server 2000 数据库兼容。现在是 2021 年,SQL Server 2000 多年前就完全失去了支持。

标签: json tsql web-services for-json


【解决方案1】:

您需要在此处取消透视数据,然后使用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');

【讨论】:

  • 甜美,这似乎恰到好处。现在让我们看看是否可以使用此设置创建一些更复杂的代码。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多