从 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
示例还不错。
我在 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
示例还不错。