【问题标题】:What are JSON best practices in SQL Server?SQL Server 中的 JSON 最佳实践是什么?
【发布时间】:2016-02-05 03:44:48
【问题描述】:

我希望从 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 为 null,则失败。

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

【问题讨论】:

  • 您能否发布一个有意义的 SQL 查询。 X 值的来源。还有你使用的是哪个版本的SQL Server
  • x 值来自另一个表,显然它们可以为空,但除了它们是有效的 varchar(20) 之外,这些值并不重要。 SQL Server 独立?这不是一个具体问题,而是一个最佳实践问题。从另一个表中动态拉取值时,是否有更好的方法使用 SQL 制作 JSON?
  • 除非没有其他选择,否则我不会从 SQL 执行此操作。您应该在本机查询结果,然后在消费应用程序中将它们转换为 json。
  • SQL Server 2016 原生支持JSONmsdn.microsoft.com/en-us/library/dn921897.aspx

标签: sql sql-server json


【解决方案1】:

[根据 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 格式进行序列化/反序列化,从而可以将您的数据分解为规范化表。在对数据运行一些聚合时,这一点尤其重要,因为将这些函数应用于规范化数据要容易得多(也更快)。

有关最后一个主题的更多详细信息可以找到here

【讨论】:

  • 所以这个答案的问题与我寻求帮助的问题相同,除非我弄错了:如果 x 为空,那么您的最终输出将是:{"key1":"Y_VALUE",} JSON 不接受训练逗号,因此这会导致 JSON 无效
  • 我同意你关于将其转移到更高级别的语言的观点 - 这会容易得多。对此解决方案的一种可能的调整是使用 hacky COALESCE(我只记得因为很久以前遇到类似的需求并且出现了快速的 SO 搜索)是这样的:select @JSON = COALESCE(@JSON + ', ', '') + '"' + Key_ + '": "' + ISNULL(Val, '') + '"' from #tokens。我认为这可以解决任何尾随逗号问题。
猜你喜欢
  • 2010-09-05
  • 2014-03-25
  • 2010-10-18
  • 1970-01-01
  • 2010-11-17
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多