我希望从SQL Server存储过程创建格式良好的JSON。
我的问题如下:
创建如下 JSON:
DECLARE @x varchar(20)
DECLARE @y varchar(20)
CREATE TABLE #temp
(
JSON varchar(max)
)
INSERT INTO #temp
VALUES (
'{' +
case when x IS NOT NULL BEGIN
'"key1":"' + x + '"' +
END
case when y IS NOT NULL BEGIN
'"key1":"' + y + '"' +
END
'}')
让"s"格式良好的 json 的最佳方法是什么?我想尽可能减少逻辑(即没有每个 x*y 组合的分支(。
如果在 x if 条件的末尾加上逗号,则在 y 为空时失败。如果在将 y 插入 json 之前放置逗号,则当 x 为空时,它将失败。
有没有更好的方法可以在SQL Server中实现这一点?
[根据OP的评论进行编辑]
我更改了 JSON 的构造方式,并将其推广到任意数量的键 => 值对:
drop table #tokens
GO
CREATE TABLE #tokens
(
Key_ VARCHAR(32),
Val VARCHAR(255)
)
INSERT INTO #tokens VALUES ('key1', 'val1'), ('key1', 'val2'), ('key3', NULL), ('key4', 'val3')
GO
DECLARE @JSON VARCHAR(MAX)
-- add key => pairs along with some newlines to have a decent output
SELECT
@JSON = CASE
WHEN @JSON IS NULL AND Key_ IS NOT NULL
THEN '"' + Key_ + '":"' + ISNULL(Val, '') + '"'
ELSE @JSON + ',' + CHAR(13) + CHAR(10) + '"' + Key_ + '":"' + ISNULL(Val, '') + '"'
END
FROM
#tokens AS T
SELECT '{' + CHAR(13) + CHAR(10) + @JSON + CHAR(13) + CHAR(10) + '}'
当然,另一种选择(对于较大的数据层次结构来说可能更容易(是用 C#/Java/其他支持 OOP 和 JSON 序列化的高级语言序列化对象。
就个人而言,我喜欢结构化数据,因为它们允许数据库约束,如外键、唯一、检查约束等。在这种情况下,我建议尽可能将数据存储在规范化表中,并在应用程序层(C#,Java等(中进行转换。
大多数语言都允许轻松地将 JSON 格式序列化/反序列化为/从 JSON 格式反序列化,以便将数据制动到规范化表中。在对数据运行某些聚合时,这一点尤其重要,因为对规范化数据应用这些函数要容易得多(也快得多(。
有关最后一个主题的更多详细信息,请参阅此处。