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

C# 使用OPENJSON将两个数组的对象插入SQL数据库,c#,json,sql-server,tsql,open-json,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列:坐标、纬度、经度坐标是自动递增的。 我想把每一对表[0]、[0]

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

{
    "Latitudes": [
    53.665084,
    53.665084,
    53.665184,
    53.665284
    ],
    "Longitudes":[
    17.342853,
    17.342953,
    17.343053,
    17.343153
    ]
}
表有3列:坐标、纬度、经度坐标是自动递增的。 我想把每一对表[0]、[0]/[1][1]等放在表中的一行。因此,对于这个对象,它将是4行

这是一段代码,它并没有像我期望的那样工作-它只是将空值放在经度和纬度列的位置,并且只创建了一行。。。而不是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"')
附言 OPENJSON函数在SQL Server 2016版或Azure SQL数据库上运行。以防万一,如果有人试图在2014年SSMS中运行此功能,即:-

使用JSON_查询解析数组:

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;
使用JSON_查询解析数组:

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数组时, 该函数将该数组中元素的索引作为键,因此您可以在这些索引上加入结果

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

您只能使用OPENJSON检索数据。 这里重要的一点是,当OPENJSON解析JSON数组时, 该函数将该数组中元素的索引作为键,因此您可以在这些索引上加入结果

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

rn应该以[key]作为rn,以[key]的方式将行的返回顺序改为rn,否则行的返回顺序将不被记录并且可能会发生更改。@DavidBrowne Microsoft感谢您的提示,现在它是完全确定的:@DavidBrowne Microsoft实际上我根本不需要行的编号。我的第一个想法是交叉应用,但在并行比较中,你的只占这批货的7%,而我的占93%+1rn应该以[key]作为rn,将行的返回顺序改为[key],否则行的返回顺序将无法记录且可能会更改。@DavidBrowne Microsoft感谢您的提示,现在它是完全确定的:@DavidBrowne Microsoft实际上我根本不需要行的编号。我的第一个想法是交叉申请,但在并行比较中,你的只占这批货的7%,而我的占93%+1当我昨天看到它时,我知道有一种方法可以做到这一点,但以我的生命来说,我无法把它分类。把这个贴在我的笔记上。谢谢你@卓洛夫工作得很有魅力。正是我所需要的-非常感谢!我甚至能够将它与由3个加法键:值对组成的对象结合起来。@KamilTurowski很高兴能提供帮助!当我昨天看到它的时候,我知道有一种方法可以做到这一点,但是,以我的生命来说,我无法把它分类。把这个贴在我的笔记上。谢谢你@卓洛夫工作得很有魅力。正是我所需要的-非常感谢!我甚至能够将它与由3个加法键:值对组成的对象结合起来。@KamilTurowski很高兴能提供帮助!