OPENJSON Преобразование столбца значения в несколько строк не работает - PullRequest
2 голосов
/ 27 сентября 2019

У меня есть файл JSON с простой структурой.Я пытаюсь извлечь данные в строки из этого файла JSON.

Файл JSON начинается с:

[{"result":
[{"country":"Germany",
  "parent":"xxxx",
"city":"Reitbrook",
"latitude":"",

Я попытался этот код, все успешно.Посмотрите на последние 3 утверждения и их результаты.Я ожидал нескольких записей в последнем утверждении SELECT.Что я делаю неправильно?

DECLARE @details VARCHAR(MAX)

Select @details  =BulkColumn FROM OPENROWSET 
 (BULK 'folder/cmn_location',   DATA_SOURCE='blogstorage',    SINGLE_CLOB) as JSON;

IF (ISJSON(@details) = 1)
    BEGIN  PRINT 'Imported JSON is Valid'     END
ELSE
    BEGIN  PRINT 'Invalid JSON Imported'      END



SELECT @details as SingleRow_Column

--delivers one row Where

--SingleRow_Column=[{"result":[{country":"Germany","parent":.....


SELECT * FROM OPENJSON(@details, '$')

--delivers one row. Where 

--Key=0, value={"result":[{"country":"Germany","parent":"xxx".....


SELECT * FROM OPENJSON(@details, '$.result') 

- вообще не доставляет строки

Теперь сообщения об ошибках, но просто нет данных

1 Ответ

1 голос
/ 27 сентября 2019

Попробуйте вот так

Подсказка: мне пришлось добавить несколько закрывающих скобок ...

DECLARE @YourJSON NVARCHAR(MAX)=
N'[{"result":
[{"country":"Germany",
  "parent":"xxxx",
"city":"Reitbrook",
"latitude":""}]}]';

SELECT B.*
FROM OPENJSON(@YourJson)        WITH(result NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.result)  WITH(country NVARCHAR(1000)
                                    ,parent NVARCHAR(1000)
                                    ,city NVARCHAR(1000) ) B;

Идея вкратце:

Ваш JSON является массивомсодержащий хотя бы один объект result.(Может быть больше объектов, но вы не показали достаточно).

Этот объект result сам является массивом.Поэтому мы используем WITH в сочетании с AS JSON и другим APPLY OPENJSON, используя вложенный массив, возвращаемый как A.result.

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