Sql server 从关系数据库提取JSON的通用方法?

Sql server 从关系数据库提取JSON的通用方法?,sql-server,json,mongodb,migration,relational-database,Sql Server,Json,Mongodb,Migration,Relational Database,好的,也许这对于StackOverflow来说太宽泛了,但是有没有一种好的、通用的方法来将关系表中的数据组装成分层JSON 例如,假设我们有一个“客户”表和一个“订单”表。我希望输出如下所示: { "customers": [ { "customerId": 123, "name": "Bob", "orders": [ { "o

好的,也许这对于StackOverflow来说太宽泛了,但是有没有一种好的、通用的方法来将关系表中的数据组装成分层JSON

例如,假设我们有一个“客户”表和一个“订单”表。我希望输出如下所示:

{
    "customers": [
        {
            "customerId": 123,
            "name": "Bob",
            "orders": [
                {
                    "orderId": 456,
                    "product": "chair",
                    "price": 100
                },
                {
                    "orderId": 789,
                    "product": "desk",
                    "price": 200
                }
            ]
        },
        {
            "customerId": 999,
            "name": "Fred",
            "orders": []
        }
    ]
}    
我宁愿不必编写大量的过程代码来循环主表,一次获取几个订单并附加它们。这将是痛苦的缓慢

我使用的数据库是MS SQL Server,但我很快也需要对MySQL做同样的事情。我使用Java和JDBC进行访问。如果这两个数据库中的任何一个有某种神奇的方式在服务器端组装这些记录,那将是理想的


人们如何从关系数据库迁移到像MongoDB这样的JSON数据库?

没有通用的方法,因为SQL Server不支持JSON作为其数据类型。您必须为此创建自己的“通用方式”

看看这篇文章。这里有一些关于如何将sql server数据操作为JSON格式的好例子


以下是一组有用的函数,用于将关系数据转换为JSON和XML,并将JSON转换回表格:

我认为一个“通用”解决方案如下:-

  • 创建一个“选择”查询,该查询将连接所有必需的表,以获取二维数组中的结果(如CSV/临时表等)
  • 如果此联接的每一行都是唯一的,并且MongoDB架构和列具有一对一的映射,那么这一切都是关于使用带有所需参数的MongoImport命令导入此CSV/表
  • 但像上面这样的情况,给定的客户ID可以有一个“订单”数组,需要在mongoImport之前进行一些计算
    您必须编写一个程序,该程序可以“垂直合并”给定客户ID的订单。对于一小部分数据,一个简单的java程序可以工作。但对于较大的集合,使用spark的并行编程可以完成这项工作

  • SQL Server 2016现在支持读取JSON的方式与多年来支持XML的方式基本相同。使用OPENJSON直接查询并存储JSON数据类型。

    SQLServer2016终于赶上并增加了对JSON的支持

    JSON支持仍然与其他产品(如PostgreSQL)不匹配,例如,没有包含特定于JSON的数据类型。然而,添加了几个有用的T-SQL语言元素,使使用JSON变得轻而易举

    例如,在以下Transact-SQL代码中,定义了包含JSON字符串的文本变量:

    DECLARE @json NVARCHAR(4000)
    SET @json = 
    N'{
        "info":{  
          "type":1,
    
          "address":{  
            "town":"Bristol",
            "county":"Avon",
            "country":"England"
          },
          "tags":["Sport", "Water polo"]
       },
       "type":"Basic"
    }'
    
    然后,您可以使用
    JSON\u VALUE
    JSON\u QUERY
    函数从JSON文本中提取值和对象:

    SELECT
      JSON_VALUE(@json, '$.type') as type,
      JSON_VALUE(@json, '$.info.address.town') as town,
      JSON_QUERY(@json, '$.info.tags') as tags
    
    此外,
    OPENJSON
    函数允许从引用的JSON数组返回元素:

    SELECT value
    FROM OPENJSON(@json, '$.info.tags')
    
    最后但并非最不重要的一点是,有一个
    FOR JSON
    子句可以将SQL结果集格式化为JSON文本:

    SELECT object_id, name
    FROM sys.tables
    FOR JSON PATH
    
    一些参考资料:


    哈哈。哈。哈哈哈。。好的一点:D SQL Server可以对XML输出执行此类查询(作为供应商的一项功能),但SQL中没有针对此任务的标准规定。使用适当的ORM/mapper可以使这样的客户机(可能在web服务中?)转换更容易。(我发现这个过程在C#/LINQ中“相对轻松”,但可能有专门为这种映射设计的工具。)你是指一个文档集合,每个客户一个文档,为他们的订单提供数组,对吗?只需将它们转储到csv或json并使用MongoImporther。这是一种管理json(以及XML和关系型)的好方法SQL Server中的通用数据:我已经看到并使用了这个。这并不完美,但对我来说效果很好。