JSON_QUERY (Transact-SQL)
Si applica a: SQL Server 2016 (13.x) e versioni successive database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics
Estrae un oggetto o una matrice da una stringa JSON.
Per estrarre un valore scalare da una stringa JSON anziché un oggetto o una matrice, vedere JSON_VALUE (Transact-SQL). Per informazioni sulle differenze tra JSON_VALUE e JSON_QUERY
, si veda Confronto tra JSON_VALUE e JSON_QUERY.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
JSON_QUERY ( expression [ , path ] )
Argomenti
expression
Espressione. In genere il nome di una variabile o di una colonna che contiene testo JSON.
Se JSON_QUERY
individua JSON non valido in expression prima di trovare il valore identificato da path, la funzione restituisce un errore. Se JSON_QUERY
Y non trova il valore identificato da path, analizza l'intero testo e restituisce un errore se rileva JSON non valido in un punto qualsiasi di expression.
path
Percorso JSON che specifica l'oggetto o la matrice da estrarre.
In SQL Server 2017 (14.x) e in Azure SQL Database è possibile fornire una variabile come valore del percorso.
Il percorso JSON può specificare la modalità lax o strict per l'analisi. Se non si specifica la modalità di analisi, la modalità predefinita è lax. Per altre informazioni, vedere Espressioni di percorso JSON (SQL Server).
Il valore predefinito per path è "$". Di conseguenza, se non si specifica un valore per path, JSON_QUERY
restituisce l'input expression.
Se il formato di path non è valido, JSON_QUERY
restituisce un errore.
Valore restituito
Restituisce un frammento JSON di tipo nvarchar(max). Le regole di confronto del valore restituito sono le stesse di quelle dell'espressione di input.
Se il valore non è un oggetto o una matrice:
In modalità lax,
JSON_QUERY
restituisce null.In modalità strict,
JSON_QUERY
restituisce un errore.
Osservazioni:
Modalità lax e modalità strict
Si consideri il testo JSON seguente:
{
"info": {
"type": 1,
"address": {
"town": "Cheltenham",
"county": "Gloucestershire",
"country": "England"
},
"tags": ["Sport", "Water polo"]
},
"type": "Basic"
}
Nella tabella seguente viene confrontato il comportamento di JSON_QUERY
in modalità lax e in modalità strict. Per altre informazioni sulla specifica facoltativa della modalità del percorso (lax o strict), vedere Espressioni di percorso JSON (SQL Server).
Percorso | Valore restituito in modalità lax | Valore restituito in modalità strict | Altre informazioni |
---|---|---|---|
$ | Restituisce l'intero testo JSON. | Restituisce l'intero testo JSON. | N/a |
$.info.type | NULL | Error | Non è un oggetto o una matrice. Usare JSON_VALUE. |
$.info.address.town | NULL | Error | Non è un oggetto o una matrice. Usare JSON_VALUE. |
$.info."address" | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | N/a |
$.info.tags | N'[ "Sport", "Water polo"]' | N'[ "Sport", "Water polo"]' | N/a |
$.info.type[0] | NULL | Error | Non è una matrice. |
$.info.none | NULL | Error | La proprietà non esiste. |
Uso di JSON_QUERY con FOR JSON
JSON_QUERY
restituisce un frammento JSON valido. Di conseguenza, FOR JSON non ignora i caratteri speciali nel valore restituito di JSON_QUERY
.
Se vengono restituiti risultati con FOR JSON e vengono inclusi dati che sono già in formato JSON, in una colonna o come risultato di un'espressione, eseguire il wrapping dei dati JSON con JSON_QUERY
senza il parametro path.
Esempi
Esempio 1
Nell'esempio seguente viene illustrato come restituire un frammento JSON da una colonna CustomFields
nei risultati della query.
SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
Esempio 2
Nell'esempio seguente viene illustrato come includere frammenti JSON nell'output della clausola FOR JSON.
SELECT StockItemID, StockItemName,
JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH