使用OPENJSON将两个数组的对象插入SQL数据库

时间:2019-05-20 21:05:00

标签: c# json sql-server tsql open-json

我想知道如何将这个由两个浮点数数组组成的JSON对象放入SQL数据库表:

{
    "Latitudes": [
    53.665084,
    53.665084,
    53.665184,
    53.665284
    ],
    "Longitudes":[
    17.342853,
    17.342953,
    17.343053,
    17.343153
    ]
}

表有3列:CoordID,纬度和经度(CoordID是自动递增的)。 我想将每对这些表([0],[0] / [1] [1]等)放在表中一行。 因此使用该对象将是4行。

这是我无法预期的代码-它只是将空值代替“经度”和“纬度”列,并且仅创建一个ROW ...(而不是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 Server 2016版或Azure SQL数据库开始工作。以防万一有人试图在SSMS 2014中运行它,即;-)

2 个答案:

答案 0 :(得分:2)

使用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;

db<>fiddle demo

答案 1 :(得分:2)

您只能使用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