Microsoft SQL Server
Ändern Sie den JSON-Text
Suche…
Ändern Sie den Wert in JSON-Text im angegebenen Pfad
Die Funktion JSON_MODIFY verwendet JSON-Text als Eingabeparameter und ändert einen Wert im angegebenen Pfad mit dem dritten Argument:
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}
Als Ergebnis erhalten wir neuen JSON-Text mit "Preis": 39,99 und andere Werte werden nicht geändert. Wenn das Objekt im angegebenen Pfad nicht vorhanden ist, fügt JSON_MODIFY ein Schlüssel / Wert-Paar ein.
Um das key: value-Paar zu löschen, setzen Sie NULL als neuen Wert:
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 löscht standardmäßig den Schlüssel, wenn er keinen Wert hat. Daher können Sie ihn zum Löschen eines Schlüssels verwenden.
Einen Skalarwert an ein JSON-Array anhängen
JSON_MODIFY verfügt über einen Anfügemodus, der den Wert an das Array anfügt.
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"]}
Wenn das Array im angegebenen Pfad nicht vorhanden ist, erstellt JSON_MODIFY (append) ein neues Array mit einem einzelnen 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"]}
Ein neues JSON-Objekt in den JSON-Text einfügen
Mit der Funktion JSON_MODIFY können Sie JSON-Objekte in JSON-Text einfügen:
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}}
Da der dritte Parameter Text ist, müssen Sie ihn mit der JSON_QUERY-Funktion umschließen, um Text in JSON "umzuwandeln". Ohne diese "Umwandlung" behandelt JSON_MODIFY den dritten Parameter als Nur-Text- und Escape-Zeichen, bevor er als Zeichenfolgenwert eingefügt wird. Ohne JSON_QUERY werden folgende Ergebnisse angezeigt:
{"Id":1,"Name":"Toy Car","Price":'{\"Min\":34.99,\"Recommended\":45.49}'}
JSON_MODIFY fügt dieses Objekt ein, wenn es nicht vorhanden ist, oder löscht es, wenn der Wert des dritten Parameters NULL ist.
Fügen Sie ein neues JSON-Array ein, das mit der FOR JSON-Abfrage erstellt wurde
Sie können ein JSON-Objekt mithilfe der standardmäßigen SELECT-Abfrage mit der FOR JSON-Klausel generieren und als dritten Parameter in JSON-Text einfügen:
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 weiß, dass die Auswahlabfrage mit der FOR JSON-Klausel ein gültiges JSON-Array generiert und es einfach in den JSON-Text einfügt.
Sie können alle FOR JSON-Optionen in der SELECT-Abfrage verwenden, außer WITHOUT_ARRAY_WRAPPER , das ein einzelnes Objekt anstelle eines JSON-Arrays generiert. In dem anderen Beispiel in diesem Thema erfahren Sie, wie ein einzelnes JSON-Objekt eingefügt wird.
Fügen Sie ein einzelnes JSON-Objekt ein, das mit der FOR JSON-Klausel generiert wurde
Sie können ein JSON-Objekt mithilfe der standardmäßigen SELECT-Abfrage mit der FOR JSON-Klausel und der Option WITHOUT_ARRAY_WRAPPER generieren und als dritten Parameter in JSON-Text einfügen:
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}}
FOR JSON mit der Option WITHOUT_ARRAY_WRAPPER generiert möglicherweise ungültigen JSON-Text, wenn die SELECT-Abfrage mehr als ein Ergebnis zurückgibt (in diesem Fall sollten Sie TOP 1 verwenden oder nach Primärschlüssel filtern). Daher nimmt JSON_MODIFY an, dass das zurückgegebene Ergebnis nur ein einfacher Text ist, und escape wie bei jedem anderen Text, wenn Sie es nicht mit der JSON_QUERY-Funktion umschließen.
Sie sollten die Abfrage FOR JSON, WITHOUT_ARRAY_WRAPPER mit der Funktion JSON_QUERY umschließen , um das Ergebnis in JSON umzuwandeln .