【问题标题】:Export to JSON format导出为 JSON 格式
【发布时间】:2019-08-31 07:07:13
【问题描述】:

我有以下 2 张桌子。实际上我需要将所有表相关和非相关表同步到另一个数据库。我正在使用 SQL Server 2017。


 CREATE TABLE EmailAddresses (
        ID int,
        EmailAddress varchar(255),
         StartDate datetime,
        EndDate datetime,   
    );   

 CREATE TABLE Cards (
        ID int,
        CardNumber varchar(255),
        ValidFrom datetime, 
        ValidTo datetime,  
        CVC  varchar(255),   
    );

我需要单个 json 文件中 2 个表的所有记录(格式如下)。

{ 
    "Sync By" : "XYZ", 
    "Sync Date" : "2021-10-16",
    "EmailAddresses" : [
        {
            "EmailAddress" : "Aisha@AEL.com", 
            "StartDate" : "2015-11-12", 
            "EndDate" : "2019-06-21"
        }, 
        {
            "EmailAddress" : "Elsie@Livulook.co.wm", 
            "StartDate" : "2014-02-09", 
            "EndDate" : "2015-12-23"
        }, 
        {
            "EmailAddress" : "Harriet23@Zaha.com", 
            "StartDate" : "2013-07-26", 
            "EndDate" : "2018-04-16"
        }
    ], 
    "Cards" : [
        {
            "CardNumber" : "340365242116610", 
            "ValidFrom" : "2015-07-28", 
            "ValidTo" : "2021-10-16", 
            "CVC" : "205"
        }

    ]
}

【问题讨论】:

  • 您认为StartDate 可以从哪里获取?您在 json 中有它,但在 SQL 中没有?
  • 从表行中获取的数据,例如:EmailAddress 表
  • 这就是重点 - StartDate 不在您指定的表格中
  • 所以更新了表格设计。,添加了开始日期

标签: sql json sql-server sql-server-2017


【解决方案1】:

您可以通过 for json 实现这一目标。

https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017

这两个将生成两个 json 数组,如果将它们组合在一起将为您提供所需的格式。

这两个属性: Sync BySync Date 在数据库中不存在,因此需要在导出时手动调整。

 select 'XYZ' as 'Sync By',
 select '2021-10-16' as 'Sync Date',

 (select ID, EmailAddress, StartDate, EndDate,   
         from table EmailAddresses
         for json path) EmailAddresses,

 (select Id, CardNumber, ValidFrom, ValidTo, CVC
         from table Cards
         for json path) Cards

  for json path

【讨论】:

  • 一个接一个地复制粘贴这两个json数组——这是最简单的方法。您仍然缺少两个 json 属性的信息源,因此无论如何都需要手动步骤。获得所有源代码后,您可以使用存储过程编写脚本。
【解决方案2】:

一种可能的方法是使用FOR JSON AUTO 从两个表中导出数据,然后使用FOR JSON PATHWITHOUT_ARRAY_WRAPPER 选项生成最终输出:

表格:

CREATE TABLE EmailAddresses (
        ID int,
        EmailAddress varchar(255),
        StartDate datetime,
        EndDate datetime,   
    );   

CREATE TABLE Cards (
        ID int,
        CardNumber varchar(255),
        ValidFrom datetime, 
        ValidTo datetime,  
        CVC  varchar(255),   
);
INSERT INTO EmailAddresses
   (ID, EmailAddress, StartDate, EndDate)
VALUES
   (1, 'Aish"a@AEL.com', '2015-11-12', '2019-06-21'),
   (2, 'Aisha@AEL.com', '2015-11-12', '2019-06-21'),
   (3, 'Aisha@AEL.com', '2015-11-12', '2019-06-21')
INSERT INTO Cards 
   (ID, CardNumber, ValidFrom, ValidTo, CVC)
VALUES
   (1, '340365242116610', '2015-07-28', '2021-10-16', '205')

声明:

SELECT 
   [Sync By] = 'XYZ', 
   [Sync Date] = '2021-10-16',
   [EmailAddresses] = (
      SELECT EmailAddress, StartDate, EndDate  
      FROM EmailAddresses
      FOR JSON AUTO
   ),
   [Cards] = (
       SELECT CardNumber, ValidFrom, ValidTo, CVC
       FROM Cards
       FOR JSON AUTO
   )
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2020-04-22
    • 2022-11-10
    • 2016-08-17
    • 2020-11-04
    • 2020-11-07
    相关资源
    最近更新 更多