Microsoft SQL Server
Ändra JSON-text
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.