SQL Server中的JSON最佳做法是什么?

时间:2016-02-04 04:05:25

标签: sql 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为null则失败。如果在将y插入json之前放入逗号,则如果x为null则失败。

有没有更好的方法在SQL Server中实现这一目标?

1 个答案:

答案 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