Sök…


Ändra värde i JSON-text på den angivna sökvägen

Funktionen JSON_MODIFY använder JSON-text som inmatningsparameter och ändrar ett värde på den angivna sökvägen med det tredje argumentet:

declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, '$.Price', 39.99)
print @json -- Output: {"Id":1,"Name":"Toy Car","Price":39.99}

Som ett resultat kommer vi att ha ny JSON-text med "Pris": 39.99 och annat värde kommer inte att ändras. Om objektet på den angivna sökvägen inte finns, kommer JSON_MODIFY att infoga nyckel: värdepar.

För att radera nyckel: värde-par, lägg NULL till som nytt värde:

declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, '$.Price', NULL)
print @json -- Output: {"Id":1,"Name":"Toy Car"}

JSON_MODIFY kommer som standard att ta bort nyckel om den inte har värde så att du kan använda den för att ta bort en nyckel.

Lägg ett skalvärde i en JSON-matris

JSON_MODIFY har "lägg till" -läge som lägger till värde i array.

declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Tags":["toy","game"]}'
set @json = JSON_MODIFY(@json, 'append $.Tags', 'sales')
print @json -- Output: {"Id":1,"Name":"Toy Car","Tags":["toy","game","sales"]}

Om matris på den angivna sökvägen inte finns, skapar JSON_MODIFY (bifogad) ny matris med ett enda element:

declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, 'append $.Tags', 'sales')
print @json -- Output {"Id":1,"Name":"Toy Car","Tags":["sales"]}

Infoga nytt JSON-objekt i JSON-texten

Med JSON_MODIFY-funktionen kan du infoga JSON-objekt i JSON-texten:

declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car"}'
set @json = JSON_MODIFY(@json, '$.Price', 
                        JSON_QUERY('{"Min":34.99,"Recommended":45.49}'))
print @json
-- Output: {"Id":1,"Name":"Toy Car","Price":{"Min":34.99,"Recommended":45.49}}

Eftersom den tredje parametern är text måste du radera in den med JSON_QUERY-funktionen för att "kasta" text till JSON. Utan denna "cast" kommer JSON_MODIFY att behandla den tredje parametern som ren text och undgå tecken innan du sätter in den som strängvärde. Utan JSON_QUERY kommer resultaten att vara:

{"Id":1,"Name":"Toy Car","Price":'{\"Min\":34.99,\"Recommended\":45.49}'}

JSON_MODIFY kommer att infoga detta objekt om det inte finns, eller ta bort det om värdet för den tredje parametern är NULL.

Infoga en ny JSON-matris genererad med FOR JSON-frågan

Du kan generera JSON-objekt med hjälp av standard SELECT-fråga med FOR JSON-klausul och infoga det i JSON-text som tredje parameter:

declare @json nvarchar(4000) = N'{"Id":17,"Name":"WWI"}'
set @json = JSON_MODIFY(@json, '$.tables', 
                        (select name from sys.tables FOR JSON PATH) )
print @json

(1 row(s) affected)
{"Id":1,"Name":"master","tables":[{"name":"Colors"},{"name":"Colors_Archive"},{"name":"OrderLines"},{"name":"PackageTypes"},{"name":"PackageTypes_Archive"},{"name":"StockGroups"},{"name":"StockItemStockGroups"},{"name":"StockGroups_Archive"},{"name":"StateProvinces"},{"name":"CustomerTransactions"},{"name":"StateProvinces_Archive"},{"name":"Cities"},{"name":"Cities_Archive"},{"name":"SystemParameters"},{"name":"InvoiceLines"},{"name":"Suppliers"},{"name":"StockItemTransactions"},{"name":"Suppliers_Archive"},{"name":"Customers"},{"name":"Customers_Archive"},{"name":"PurchaseOrders"},{"name":"Orders"},{"name":"People"},{"name":"StockItems"},{"name":"People_Archive"},{"name":"ColdRoomTemperatures"},{"name":"ColdRoomTemperatures_Archive"},{"name":"VehicleTemperatures"},{"name":"StockItems_Archive"},{"name":"Countries"},{"name":"StockItemHoldings"},{"name":"sysdiagrams"},{"name":"PurchaseOrderLines"},{"name":"Countries_Archive"},{"name":"DeliveryMethods"},{"name":"DeliveryMethods_Archive"},{"name":"PaymentMethods"},{"name":"SupplierTransactions"},{"name":"PaymentMethods_Archive"},{"name":"TransactionTypes"},{"name":"SpecialDeals"},{"name":"TransactionTypes_Archive"},{"name":"SupplierCategories"},{"name":"SupplierCategories_Archive"},{"name":"BuyingGroups"},{"name":"Invoices"},{"name":"BuyingGroups_Archive"},{"name":"CustomerCategories"},{"name":"CustomerCategories_Archive"}]}

JSON_MODIFY vet att markerad fråga med FOR JSON-klausul genererar giltig JSON-matris och den kommer bara att infoga den i JSON-texten.

Du kan använda alla FOR JSON-alternativ i SELECT-fråga, förutom UTAN_ARRAY_WRAPPER , som kommer att generera enstaka objekt i stället för JSON-matris. Se andra exempel i det här ämnet för att se hur du sätter in ett enda JSON-objekt.

Sätt i ett enda JSON-objekt genererat med FOR JSON-klausulen

Du kan generera JSON-objekt med hjälp av standard SELECT-fråga med FOR JSON-klausul och MEDOUT_ARRAY_WRAPPER-alternativet och infoga det i JSON-text som en tredje parameter:

declare @json nvarchar(4000) = N'{"Id":17,"Name":"WWI"}'
set @json = JSON_MODIFY(@json, '$.table', 
                        JSON_QUERY(
                         (select name, create_date, schema_id
                           from sys.tables
                           where name = 'Colors' 
                           FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
print @json

(1 row(s) affected)
{"Id":17,"Name":"WWI","table":{"name":"Colors","create_date":"2016-06-02T10:04:03.280","schema_id":13}}

FÖR JSON med WITHOUT_ARRAY_WRAPPER-alternativet kan generera ogiltig JSON-text om SELECT-frågan returnerar mer än ett resultat (du bör använda TOP 1 eller filtrera med primärnyckel i detta fall). Därför kommer JSON_MODIFY att anta att returnerat resultat bara är en vanlig text och undgå den som alla andra text om du inte lindar den med JSON_QUERY-funktionen.

Du bör lindra FÖR JSON, UTAN_ARRAY_WRAPPER- frågan med JSON_QUERY- funktionen för att kasta resultatet till JSON.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow