假设我有以下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,则需要将OPENJSON()
与APPLY
或OPENJSON()
和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