从 SQL 服务器 Table 创建 JSON,列值为 JSON 属性 名称

Create JSON from SQL Server Table With Column Value as JSON Property Name

我在 SQL Azure DB(2019 兼容级别)中有一个具有以下架构的 table:

CREATE TABLE dbo.Properties
(
    PropertyId int, 
    PropertyName nvarchar(100),
    PropertyValue nvarchar(1000)
)

我想获取此 table 中的数据并将其转换为 JSON 使用 PropertyName 列中的值作为 JSON 属性,显然 PropertyValue 值是 JSON 属性 值。

编辑 2021 年 12 月 10 日: 重要的是,PropertyName 列中的值不会提前谓词table。

例如,考虑 table(3 行)中的数据:

1, "Color", "Blue"
1, "Name", "John"
1, "Cost", 5

上面会变成下面的JSON:

{"Color":"Blue", "Name":"John", "Cost":5}

我显然可以使用如下 STRING_AGG 函数来做到这一点:

SELECT '{' + STRING_AGG( '"' + p.PropertyName + '": ''' + p.PropertyValue,''',')  
WITHIN GROUP (ORDER BY p.PropertyName) + '}' AS MyJson
FROM dbo.Properties p
GROUP BY p.Id

但我希望使用 JSON 中的一个内置函数,而不是拼凑一个大字符串。

FOR JSON AUTO 从列名开始工作,因此获得所需结果的一种方法是将 属性 名称插入列中。例如:

SELECT Color, [Name], Cost 
FROM dbo.Properties
PIVOT ( MAX( PropertyValue ) For PropertyName In ( [Color], [Name], Cost ) ) pvt
FOR JSON AUTO;

我的结果:

当然,只有当您的 JSON 属性/列名称始终为人所知时,这才是方便的,这是一个简单的示例。对于更复杂的示例,您可能正在查看动态数据透视或动态 SQL,并且您的 STRING_AGG 示例还不错。