SQL Server-如何将JSON转换为关系数据库

时间:2018-09-26 10:33:32

标签: sql json sql-server

我们如何使用SQL将JSON语句转换为不同的表? 例如,我们有JSON:

url('pic.jpg');

在关系数据库中,一旦转换了JSON,我们将获得两个表 例如,模式“ Table1”:

{"table1":
    {"Name":"table1","Items": 
        [{"Id":1,"FirstName":"John",
         "LastName":"Wen","Country":"UK",
         "PostCode":1234,"Status":false,
         "Date":"2018-09-18T08:30:32.91",}]},
 "table2":
     {"Name":"table2","Items":
        [{"Id":1,"Name":"leo",
         "StudentId":102,"CreatedDate":"2018-09-18","Location":"USA"}]}}

“ Table2”将如下所示:

Id  FirstName  LastName  Country  PostCode  Status   Date
1   John       Wen       UK       1234      false    2018-09-18T08:30:32.91

任何人都可以对此提出任何建议。

3 个答案:

答案 0 :(得分:1)

您可以使用openjson和json_value函数执行此操作。请尝试以下操作:

Declare @json nvarchar(max),@table1Items nvarchar(max), @table2Items nvarchar(max)
set @json='{
    "table1": {
        "Name": "table1",
        "Items": [{
            "Id": 1,
            "FirstName": "John",
            "LastName": "Wen",
            "Country": "UK",
            "PostCode": 1234,
            "Status": false,
            "Date": "2018-09-18T08:30:32.91"
        }, {
            "Id": 2,
            "FirstName": "John1",
            "LastName": "Wen1",
            "Country": "UK1",
            "PostCode": 12341,
            "Status": true,
            "Date": "2018-09-15T08:30:32.91"
        }]
    },
    "table2": {
        "Name": "table2",
        "Items": [{
            "Id": 1,
            "Name": "leo",
            "StudentId": 102,
            "CreatedDate": "2018-09-18",
            "Location": "USA"
        }]
    }
}'

set @table1Items=(select value from OpenJSON((select value from OpenJSON(@Json) where [key]='table1')) where [key]='Items') 
set @table2Items=(select value from OpenJSON((select value from OpenJSON(@Json) where [key]='table2')) where [key]='Items') 
--select for table 1
select JSON_VALUE(val,'$.Id') as ID,
 JSON_VALUE(val,'$.FirstName') as FirstName,
JSON_VALUE(val,'$.LastName') as LastName,
JSON_VALUE(val,'$.Country') as Country,
JSON_VALUE(val,'$.PostCode') as PostCode,
JSON_VALUE(val,'$.Status') as Status,
JSON_VALUE(val,'$.Date') as Date
from
(
select value as val from openJSON(@table1Items)
) AS Table1JSON

--select for table 1
select JSON_VALUE(val,'$.Id') as ID,
 JSON_VALUE(val,'$.Name') as FirstName,
JSON_VALUE(val,'$.StudentId') as LastName,
JSON_VALUE(val,'$.CreatedDate') as Country,
JSON_VALUE(val,'$.Location') as PostCode

from
(
select value as val from openJSON(@table2Items)
) AS Table2JSON

它完全按照您的要求工作。最后,两个select语句返回您提到的表。只需使用insert into select将它们添加到所需的表中即可。我还尝试将另一个对象添加到table1数组中并验证它是否可以正常工作,即为两个对象返回两行。希望这会有所帮助

答案 1 :(得分:1)

如果SQL版本2016+使用OPENJSON AND with_clause:

https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-2017

    DECLARE @JsonData NVARCHAR(MAX);

    SET @JsonData = N'
    {
      "table1": {
        "Name": "table1",
        "Items": [
          {
            "Id": 1,
            "FirstName": "John",
            "LastName": "Wen",
            "Country": "UK",
            "PostCode": 1234,
            "Status": false,
            "Date": "2018-09-18T08:30:32.91"
          },
          {
            "Id": 2,
            "FirstName": "John1",
            "LastName": "Wen1",
            "Country": "UK1",
            "PostCode": 12341,
            "Status": true,
            "Date": "2018-09-15T08:30:32.91"
          }
        ]
      },
      "table2": {
        "Name": "table2",
        "Items": [
          {
            "Id": 1,
            "Name": "leo",
            "StudentId": 102,
            "CreatedDate": "2018-09-18",
            "Location": "USA"
          }
        ]
      }
    }
    ';

    --Table1
    SELECT [a].[Id]
         , [a].[FistName]
         , [a].[Lastname]
         , [a].[Country]
         , [a].[PostCode]
         , [a].[Status]
         , [a].[Date]
    FROM
           OPENJSON(@JsonData, '$.table1.Items')
               WITH (
                        [Id] INT '$.Id'
                      , [FistName] NVARCHAR(200) '$.FirstName'
                      , [Lastname] NVARCHAR(200) '$.LastName'
                      , [Country] NVARCHAR(200) '$.Country'
                      , [PostCode] NVARCHAR(200) '$.PostCode'
                      , [Status] NVARCHAR(200) '$.Status'
                      , [Date] DATETIME '$.Date'
                    ) [a];

    --Table2
    SELECT [a].[Id]
         , [a].[Name]
         , [a].[StudentId]
         , [a].[CreatedDate]
         , [a].[Location]
    FROM
           OPENJSON(@JsonData, '$.table2.Items')
               WITH (
                        [Id] INT '$.Id'
                      , [Name] NVARCHAR(200) '$.Name'
                      , [StudentId] INT '$.StudentId'
                      , [CreatedDate] DATETIME '$.CreatedDate'
                      , [Location] NVARCHAR(200) '$.Location'
                    ) [a];

答案 2 :(得分:0)

尝试在SQL Server中使用OPENJSON函数:

ReferenceLink_1

ReferenceLink_2