使用 OPENJSON 将两个数组的对象插入 SQL 数据库
Inserting object of two arrays into SQL Database using OPENJSON
我想知道如何将这个 JSON 对象 由两个浮点数数组 组成,放入 SQL 数据库 Table:
{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}
Table 有 3 列:CoordID、Latitude、Longitude(CoordID 是自动递增的)。
我想将每一对 table([0]、[0] / [1][1] 等)作为 table 中的一行。 因此对于这个对象,它将是 4 行。
这里的代码没有像我预期的那样工作——它只是用空值代替 "Longitude" 和 "Latitude" 列,它只创建一行...(而不是 4行):
declare @json NVARCHAR(MAX);
SET @json=
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}'
insert into dbo.Coords(
[Latitude],[Longitude])
select Latitude, Longitude from OPENJSON(@json)
WITH(
Latitude FLOAT '$."Latitudes"',
Longitude FLOAT '$."Longitudes"')
P.S
OPENJSON() 函数适用于 SQL 服务器或 Azure SQL 数据库的 2016 版。以防万一有人会在 SSMS 2014 中尝试 运行 这个,即 ;-)
使用JSON_QUERY
解析数组:
declare @json NVARCHAR(MAX) =
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}';
WITH cte1 AS (
select A.value Latitude, [key] AS rn from OPENJSON(JSON_QUERY(@json,'$.Latitudes')) A
), cte2 AS (
select A.value Longitude,[key] AS rn from OPENJSON(JSON_QUERY(@json,'$.Longitudes')) A
)
--insert into dbo.Coords([Latitude],[Longitude])
SELECT Latitude, Longitude
FROM cte1
JOIN cte2
ON cte1.rn = cte2.rn;
您只能使用 OPENJSON()
检索您的数据。
这里的重要部分是,当 OPENJSON()
解析 JSON
数组时,
函数 returns 这个数组中元素的索引作为键,所以你可以在这些索引上加入结果。
T-SQL:
DECLARE @json NVARCHAR(MAX);
SET @json=
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes": [
17.342853,
17.342953,
17.343053,
17.343153
]
}'
--INSERT INTO dbo.Coords([Latitude], [Longitude])
SELECT j1.[value], j2.[value]
FROM
OPENJSON(@json, '$.Latitudes') j1,
OPENJSON(@json, '$.Longitudes') j2
WHERE j1.[key] = j2.[key]
输出(来自 SELECT
语句):
---------------------
value value
---------------------
53.665084 17.342853
53.665084 17.342953
53.665184 17.343053
53.665284 17.343153
我想知道如何将这个 JSON 对象 由两个浮点数数组 组成,放入 SQL 数据库 Table:
{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}
Table 有 3 列:CoordID、Latitude、Longitude(CoordID 是自动递增的)。 我想将每一对 table([0]、[0] / [1][1] 等)作为 table 中的一行。 因此对于这个对象,它将是 4 行。
这里的代码没有像我预期的那样工作——它只是用空值代替 "Longitude" 和 "Latitude" 列,它只创建一行...(而不是 4行):
declare @json NVARCHAR(MAX);
SET @json=
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}'
insert into dbo.Coords(
[Latitude],[Longitude])
select Latitude, Longitude from OPENJSON(@json)
WITH(
Latitude FLOAT '$."Latitudes"',
Longitude FLOAT '$."Longitudes"')
P.S OPENJSON() 函数适用于 SQL 服务器或 Azure SQL 数据库的 2016 版。以防万一有人会在 SSMS 2014 中尝试 运行 这个,即 ;-)
使用JSON_QUERY
解析数组:
declare @json NVARCHAR(MAX) =
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes":[
17.342853,
17.342953,
17.343053,
17.343153
]
}';
WITH cte1 AS (
select A.value Latitude, [key] AS rn from OPENJSON(JSON_QUERY(@json,'$.Latitudes')) A
), cte2 AS (
select A.value Longitude,[key] AS rn from OPENJSON(JSON_QUERY(@json,'$.Longitudes')) A
)
--insert into dbo.Coords([Latitude],[Longitude])
SELECT Latitude, Longitude
FROM cte1
JOIN cte2
ON cte1.rn = cte2.rn;
您只能使用 OPENJSON()
检索您的数据。
这里的重要部分是,当 OPENJSON()
解析 JSON
数组时,
函数 returns 这个数组中元素的索引作为键,所以你可以在这些索引上加入结果。
T-SQL:
DECLARE @json NVARCHAR(MAX);
SET @json=
'{
"Latitudes": [
53.665084,
53.665084,
53.665184,
53.665284
],
"Longitudes": [
17.342853,
17.342953,
17.343053,
17.343153
]
}'
--INSERT INTO dbo.Coords([Latitude], [Longitude])
SELECT j1.[value], j2.[value]
FROM
OPENJSON(@json, '$.Latitudes') j1,
OPENJSON(@json, '$.Longitudes') j2
WHERE j1.[key] = j2.[key]
输出(来自 SELECT
语句):
---------------------
value value
---------------------
53.665084 17.342853
53.665084 17.342953
53.665184 17.343053
53.665284 17.343153