将JSON解压到最低级别的SQL Server表的最佳方法是什么?

问题描述 投票:0回答:1

假设我有以下JSON Blob:

{
  "FirstName": "John",
  "LastName": "Smith",
  "Pets": [
    {
      "PetName": "Rex",
      "PetType": "Dog"
    },
    {
      "PetName": "Mittens",
      "PetType": "Cat"
    }
  ]
}

将其解压缩到如下所示的SQL Server表中的最佳方法是什么:

+-----------+----------+---------+---------+
| FirstName | LastName | PetName | PetType |
+-----------+----------+---------+---------+
| John      | Smith    | Rex     | Dog     |
| John      | Smith    | Mittens | Cat     |
+-----------+----------+---------+---------+

我实际上正在处理的JSON非常大,因此需要以编程方式完成。

json sql-server tsql
1个回答
1
投票

如果要解析此JSON,则需要将OPENJSON()APPLYOPENJSON()JSON_VALUE()的组合一起使用。请注意,该语句取决于JSON结构,并且您至少需要SQL Server 2016:

JSON:

DECLARE @json nvarchar(max) = N'{
  "FirstName": "John",
  "LastName": "Smith",
  "Pets": [
    {
      "PetName": "Rex",
      "PetType": "Dog"
    },
    {
      "PetName": "Mittens",
      "PetType": "Cat"
    }
  ]
}'

带有OPENJSON()和其他APPLY运算符的声明:

SELECT j1.FirstName, j1.LastName, j2.PetName, j2.PetType
FROM OPENJSON(@json) WITH (
   FirstName varchar(50) '$.FirstName',
   LastName varchar(50) '$.LastName',
   Pets nvarchar(max) '$.FirtstName' AS JSON
) j1
CROSS APPLY OPENJSON(@json, '$.Pets') WITH (
   PetName varchar(50) '$.PetName',
   PetType varchar(50) '$.PetType'
) j2

OPENJSON()JSON_VALUE()的声明:

SELECT 
   JSON_VALUE(@json, '$.FirstName') AS FirsttName,
   JSON_VALUE(@json, '$.LastName') AS LastName,
   PetName,
   PetType
FROM OPENJSON(@json, '$.Pets') WITH (
   PetName varchar(50) '$.PetName',
   PetType varchar(50) '$.PetType'
)

结果:

FirsttName  LastName    PetName    PetType
John        Smith       Rex        Dog
John        Smith       Mittens    Cat
© www.soinside.com 2019 - 2024. All rights reserved.