Megosztás a következőn keresztül:


JSON_QUERY (Transact-SQL)

A következőkre vonatkozik: Az SQL Server 2016 (13.x) és újabb verziói Az Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics végpontja a Microsoft FabricWarehouse-ban a Microsoft FabricSQL Database-ben a Microsoft Fabricben

A JSON_QUERY szintaxis egy objektumot vagy tömböt nyer ki egy JSON-sztringből.

Ha objektum vagy tömb helyett JSON-sztringből szeretne skaláris értéket kinyerni, tekintse meg a JSON_VALUE. A különbségekről JSON_VALUEJSON_QUERYa JSON_VALUE és a JSON_QUERY összehasonlítása című témakörben olvashat.

Transact-SQL szintaxis konvenciói

Syntax

JSON_QUERY ( expression [ , path ] [ WITH ARRAY WRAPPER ] )

Arguments

expression

Egy kifejezés. Általában egy JSON-szöveget tartalmazó változó vagy oszlop neve.

Ha JSON_QUERY a kifejezésben érvénytelen JSON-t talál, mielőtt megkeresi az elérési út által azonosított értéket, a függvény hibát ad vissza. Ha JSON_QUERY nem találja az elérési út által azonosított értéket, a teljes szöveget megvizsgálja, és hibát ad vissza, ha olyan JSON-t talál, amely a kifejezésben sehol nem érvényes.

path

Egy JSON-elérési út, amely meghatározza a kinyerni kívánt objektumot vagy tömböt.

Az SQL Server 2017-ben (14.x) és az Azure SQL Database-ben megadhat egy változót az elérési út értékeként.

A JSON-elérési út megadhatja a hasadékot vagy a szigorú elemzési módot. Ha nem adja meg az elemzési módot, a lax mód az alapértelmezett. További információ: JSON Path Expressions in the SQL Database Engine.

Az elérési út alapértelmezett értéke.$ Ennek eredményeképpen, ha nem ad meg értéket az elérési úthoz, JSON_QUERY a bemeneti kifejezést adja vissza.

Ha az elérési út formátuma érvénytelen, JSON_QUERY hibát ad vissza.

TÖMBBURKOLÓVAL

Note

WITH ARRAY WRAPPER jelenleg előzetes verzióban van, és csak SQL Server 2025 (17.x) verzióban érhető el.

Az ANSI SQL-függvény JSON_QUERY jelenleg egy JSON-objektum vagy tömb visszaadására szolgál egy megadott elérési úton. Az SQL/JSON útkifejeződésben megjelent tömb-vadkártyák támogatásával, amelyet az SQL Server 2025 (17.x) vezetett be, JSON_QUERY használható a JSON tömbben található elemek meghatározott tulajdonságainak visszaadására, ahol minden elem JSON objektum. Mivel a helyettesítő karakterek keresése több értéket is visszaadhat, adja meg a WITH ARRAY WRAPPER JSON-lekérdezési kifejezés záradékát, valamint egy SQL/JSON-elérési útkifejezést helyettesítő karakterrel vagy tartománnyal vagy listával, hogy JSON-tömbként adja vissza az értékeket. WITH ARRAY WRAPPER záradék csak akkor támogatott, ha a bemenet json típusú.

Vegye figyelembe a következő JSON-dokumentumot:

DECLARE @j AS JSON = '{
    "id": 2,
    "first_name": "Mamie",
    "last_name": "Baudassi",
    "email": "mbaudassi1@example.com",
    "gender": "Female",
    "ip_address": "148.199.129.123",
    "credit_cards": [
        {
            "type": "jcb",
            "card#": "3545138777072343",
            "currency": "Koruna"
        },
        {
            "type": "diners-club-carte-blanche",
            "card#": "30282304348533",
            "currency": "Dong"
        },
        {
            "type": "jcb",
            "card#": "3585303288595361",
            "currency": "Yuan Renminbi"
        },
        {
            "type": "maestro",
            "card#": "675984450768756054",
            "currency": "Rupiah"
        },
        {
            "type": "instapayment",
            "card#": "6397068371771473",
            "currency": "Euro"
        }
    ]
}';

Az elérési út $.credit_cards egy JSON-tömbre mutat, ahol minden elem érvényes JSON-objektum. Most a JSON_QUERY függvény tömb helyettesítő karakterek támogatásával is használható a type tulajdonság összes vagy meghatározott értékének visszaadására, például:

SELECT JSON_QUERY(@j, '$.credit_cards[*].type' WITH ARRAY WRAPPER);

Az alábbi táblázat különböző példákat mutat be az SQL/JSON elérési út kifejezésére helyettesítő karakterrel és a visszatérési érték használatával JSON_QUERY WITH ARRAY WRAPPER.

Path Visszaadott érték
$.credit_cards[0].type ["jcb"]
$.credit_cards[*].type ["jcb","diners-club-carte-blanche","jcb","maestro","instapayment"]
$.credit_cards[0, 2].type ["jcb","jcb"]
$.credit_cards[1 to 3].type ["diners-club-carte-blanche","jcb","maestro"]
$.credit_cards[last].type ["instapayment"]
$.credit_cards[last, 0].type ["instapayment","jcb"]
$.credit_cards[last, last].type ["instapayment","instapayment"]
$.credit_cards[ 0, 2, 4].type ["jcb","jcb","instapayment"]

Visszaadott érték

Egy Nvarchar(max) típusú JSON-töredéket ad vissza. A visszaadott érték rendezése megegyezik a bemeneti kifejezés rendezésével.

Ha az érték nem objektum vagy tömb:

  • Lax módban a JSON_QUERY null értéket ad vissza.

  • Szigorú módban JSON_QUERY hibát ad vissza.

Remarks

Hasadt mód és szigorú mód

Vegye figyelembe a következő JSON-szöveget:

{
   "info": {
      "type": 1,
      "address": {
         "town": "Cheltenham",
         "county": "Gloucestershire",
         "country": "England"
      },
      "tags": ["Sport", "Water polo"]
   },
   "type": "Basic"
}

Az alábbi táblázat a JSON_QUERY viselkedését hasonlítja össze laza módban és szigorú módban. Az opcionális elérésiút-mód specifikációjáról (lax vagy szigorú) további információt az SQL Database Engine JSON-elérésiút-kifejezéseiben talál.

Path Visszatérési érték hasadó módban Érték visszaadott értéke szigorú módban További információk
$ A teljes JSON-szöveget adja vissza. A teljes JSON-szöveget adja vissza.
$.info.type NULL Error Nem objektum vagy tömb.

Használjon inkább JSON_VALUE.
$.info.address.town NULL Error Nem objektum vagy tömb.

Használjon inkább 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 Nem tömb.
$.info.none NULL Error A tulajdonság nem létezik.

A JSON_QUERY használata a FOR JSON-nal

JSON_QUERY érvényes JSON-töredéket ad vissza. Ennek eredményeképpen FOR JSON nem menekül a JSON_QUERY visszatérési érték speciális karakterei elől.

Ha a FOR JSON használatával ad vissza eredményeket, és olyan adatokat is tartalmaz, amelyek már JSON formátumban vannak (oszlopban vagy kifejezés eredményeként), csomagolja be a JSON-adatokat JSON_QUERY az elérési út paramétere nélkül.

Examples

A. JSON-töredék visszaadása

Az alábbi példa bemutatja, hogyan lehet JSON-töredékeket visszaadni egy CustomFields oszlopból a lekérdezési eredményekben.

SELECT PersonID,
       FullName,
       JSON_QUERY(CustomFields, '$.OtherLanguages') AS Languages
FROM Application.People;

B. JSON-töredékek belefoglalása a JSON-kimenetbe

Az alábbi példa bemutatja, hogyan lehet JSON-töredékeket belefoglalni a FOR JSON záradék kimenetében.

SELECT StockItemID,
       StockItemName,
       JSON_QUERY(Tags) AS Tags,
       JSON_QUERY(CONCAT('["', ValidFrom, '","', ValidTo, '"]')) AS ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH;

C. A TÖMBBURKOLÓ használata JSON_QUERY függvénnyel

Az alábbi példa azt mutatja be, WITH ARRAY WRAPPER hogy a JSON_QUERY függvény használatával több elemet ad vissza egy JSON-tömbből:

DECLARE @j JSON = '
{"id":2, "first_name":"Mamie", "last_name":"Baudassi", "email":"mbaudassi1@example.com", "gender":"Female", "ip_address":"148.199.129.123", "credit_cards":[ {"type":"jcb", "card#":"3545138777072343", "currency":"Koruna"}, {"type":"diners-club-carte-blanche", "card#":"30282304348533", "currency":"Dong"}, {"type":"jcb", "card#":"3585303288595361", "currency":"Yuan Renminbi"}, {"type":"maestro", "card#":"675984450768756054", "currency":"Rupiah"}, {"type":"instapayment", "card#":"6397068371771473", "currency":"Euro"}]}
';
SELECT JSON_QUERY(@j, '$.credit_cards[*].type' WITH ARRAY WRAPPER ) as credit_card_types;

Itt van az eredmények összessége.

credit_card_types
--------
["jcb","diners-club-carte-blanche","jcb","maestro","instapayment"]