Вставка объекта из двух массивов в базу данных SQL с помощью OPENJSON - PullRequest
1 голос
/ 21 мая 2019

Интересно, как я могу поместить этот объект JSON, , состоящий из двух массивов чисел с плавающей точкой , в таблицу базы данных SQL:

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

Таблица имеет 3 столбца: CoordID, Latitude, Longitude(CoordID автоматически увеличивается).Я хотел бы поместить каждую пару этих таблиц ([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"')

PS Функция OPENJSON () работает с версии SQL Server 2016 или в базе данных SQL Azure,На всякий случай, если кто-нибудь попытается запустить это в SSMS 2014, т.е.; -)

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Вы можете получить свои данные, используя только 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
2 голосов
/ 21 мая 2019

Использование 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;

ДБ <> Fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...