我希望从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为null则失败。如果在将y插入json之前放入逗号,则如果x为null则失败。
有没有更好的方法在SQL Server中实现这一目标?
答案 0 :(得分:0)
[根据OP的评论编辑]
我已经改变了JSON的构造方式,并将其推广到任意数量的key =>价值对:
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) + '}'
当然,另一个选项(对于更大的数据层次结构可能更容易)是使用支持OOP和JSON序列化的C#/ Java /其他高级语言来序列化对象。
就个人而言,我喜欢结构化数据,因为它们允许数据库约束,如外键,唯一,检查约束等。在这种情况下,我建议尽可能将数据存储在规范化表中并在应用程序层中进行转换(C# ,Java等。)。
大多数语言都允许轻松地序列化/反序列化为JSON格式,因此可以将数据制成规范化表格。在对数据运行某些聚合时,这一点尤其重要,因为在规范化数据上应用这些函数要容易得多(也更快)。
有关这最后一个主题的更多详细信息,请访问here。