SQL Server 中的 JSON 最佳实践是什么?



我希望从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 格式反序列化,以便将数据制动到规范化表中。在对数据运行某些聚合时,这一点尤其重要,因为对规范化数据应用这些函数要容易得多(也快得多(。

有关最后一个主题的更多详细信息,请参阅此处。

相关内容

最新更新