Использование T-SQL для получения результатов из файла Json, а не повторение нескольких подобъектов - PullRequest
1 голос
/ 15 июня 2019

Следуя документации MS, я могу получить простой пример загрузки файла json в результаты SQL.Проблемы возникают, когда у меня более одного подобъекта.Этот код будет проходить по всем элементам, если он находится на корневом уровне.Поскольку у меня есть 2 объекта в разделе «Покупка», я должен явно ссылаться на них.Есть ли более простой способ вернуть результаты для всех подобъектов?В этом случае я бы хотел две строки информации о заказе.

Также необходимо жестко закодировать имя файла в OPENROWSET вместо использования (@file).Любые идеи о синтаксисе, чтобы передать переменную для файла?

Код

USE TempDB

DECLARE @json AS NVARCHAR(MAX)
DECLARE @file AS NVARCHAR(MAX)

SET @file = 'c:\temp\test.json';
SELECT @json = BulkColumn FROM OPENROWSET (BULK 'c:\temp\test2.json', SINGLE_CLOB) AS j

SELECT * 
FROM OPENJSON ( @json )  
WITH (   
    Number   varchar(200) '$.Purchase[0].Order.Number' ,  
    Date     datetime     '$.Purchase[0].Order.Date',  
    Customer varchar(200) '$.Purchase[0].AccountNumber',  
    Quantity int          '$.Purchase[0].Item.Quantity'  
 ) 

Содержимое файла:

{
    "Purchase": [
    {
        "Order": {
            "Number": "SO43659",
            "Date": "2011-05-31T00:00:00"
        },
        "AccountNumber": "AW29825",
        "Item": {
            "Price": 2024.9940,
            "Quantity": 1
        }
    },
    {
        "Order": {
            "Number": "SO43661",
            "Date": "2011-06-01T00:00:00"
        },
        "AccountNumber": "AW73565",
        "Item": {
            "Price": 2024.9940,
            "Quantity": 3
        }
    }
]
}

Ссылка:

https://docs.microsoft.com/en-us/sql/relational-databases/json/convert-json-data-to-rows-and-columns-with-openjson-sql-server?view=sql-server-2017#option-2---openjson-output-with-an-explicit-structure

Спасибо, Билл

1 Ответ

1 голос
/ 15 июня 2019

Чтобы получить обе строки, вам нужно использовать второй аргумент функции OPENJSON, например:

SELECT * 
FROM OPENJSON ( @json,'$.Purchase' )  
WITH (   
    Number   varchar(200) '$.Order.Number' ,  
    Date     datetime     '$.Order.Date',  
    Customer varchar(200) '$.AccountNumber',  
    Quantity int          '$.Item.Quantity'  
 )

Таким образом, вы сообщаете SQL Server, что вы хотите, чтобы все узлы находились под '$ .Purchase 'path (и он находит две строки).Без этого вы бы получили все узлы под root (и он находит только одну строку, узел покупки).

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