JSON_QUERY (Transact-SQL)
Применимо к: SQL Server 2016 (13.x) и более поздних версий Azure SQL Database Управляемый экземпляр SQL AzureAzure Synapse Analytics
Извлекает объект или массив из строки JSON.
Чтобы извлечь скалярное значение, а не объект или массив из строки JSON, см. раздел JSON_VALUE (Transact-SQL). Сведения о различиях между JSON_VALUE и JSON_QUERY см. в разделе Сравнение JSON_VALUE и JSON_QUERY.
Соглашения о синтаксисе Transact-SQL
Синтаксис
JSON_QUERY ( expression [ , path ] )
Аргументы
expression
Выражение. Обычно имя переменной или столбца, содержащего текст JSON.
Если функция JSON_QUERY находит код JSON, который не является допустимым в выражении перед тем, как она найдет значение, определяемое путем, функция возвращает ошибку. Если функция JSON_QUERY не находит значение, определяемое путем, она просматривает весь текст и возвращает ошибку, если он найдет недопустимый код JSON в любом месте выражения.
путь
Путь JSON, который указывает объект или массив для извлечения.
В SQL Server 2017 (14.x); и База данных SQL Azure можно указать переменную в качестве значения пути.
В пути JSON можно указать режим синтаксического анализа: нестрогий или строгий режим. Если режим анализа не указан явно, по умолчанию используется нестрогий режим. Дополнительные сведения см. в статье Выражения пути JSON (SQL Server).
Значение пути по умолчанию — '$'. Поэтому если не указать значение для пути, JSON_QUERY возвращает входное выражение.
Если путь имеет недопустимый формат, JSON_QUERY возвращает ошибку.
Возвращаемое значение
Возвращает фрагмент JSON типа nvarchar(max). Параметры сортировки для возвращаемого значения совпадают с параметрами сортировки входного выражения.
Если значение не является объектом или массивом:
В нестрогом режиме JSON_QUERY возвращает значение NULL.
В строгом режиме JSON_QUERY возвращает сообщение об ошибке.
Remarks
Нестрогий и строгий режимы
Рассмотрим следующий текст JSON:
{
"info": {
"type": 1,
"address": {
"town": "Cheltenham",
"county": "Gloucestershire",
"country": "England"
},
"tags": ["Sport", "Water polo"]
},
"type": "Basic"
}
В следующей таблице сравнивается поведение JSON_QUERY в нестрогом и в строгом режиме. Дополнительные сведения о необязательном режиме пути (строгий или нестрогий) см. в статье Выражения пути JSON (SQL Server).
путь | Возвращаемое значение в нестрогом режиме | Возвращаемое значение в строгом режиме | Дополнительные сведения |
---|---|---|---|
$ | Возвращает весь текст JSON. | Возвращает весь текст JSON. | Недоступно |
$.info.type | NULL | Error | Значение не является объектом или массивом. Используйте JSON_VALUE. |
$.info.address.town | NULL | Error | Значение не является объектом или массивом. Используйте JSON_VALUE. |
$.info."address" | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | Недоступно |
$.info.tags | N'[ "Sport", "Water polo"]' | N'[ "Sport", "Water polo"]' | Недоступно |
$.info.type[0] | NULL | Error | Не является массивом. |
$.info.none | NULL | Error | Свойство не существует. |
Использование JSON_QUERY с FOR JSON
JSON_QUERY возвращает допустимый фрагмент JSON. Поэтому FOR JSON не экранирует специальные символы в возвращаемом значении JSON_QUERY.
Если вы возвращаете результаты для FOR JSON и включаете данные, которые уже находятся в формате JSON (в столбце или в результате выражения), оберните данные JSON с помощью JSON_QUERY без параметра путь.
Примеры
Пример 1
В следующем примере показано, как можно вернуть фрагмент JSON из столбца CustomFields
в результатах запроса.
SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
Пример 2
В следующем примере показано, как включить фрагменты JSON в выходные данные предложения FOR JSON.
SELECT StockItemID, StockItemName,
JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по