In SQL Server können Sie T-SQL JSON_MODIFY()
verwenden Funktion, um den Wert einer Eigenschaft in einer JSON-Zeichenfolge zu ändern. Die Funktion gibt die aktualisierte JSON-Zeichenfolge zurück.
Syntax
Die Syntax lautet wie folgt:
JSON_MODIFY ( expression , path , newValue )
Wobei expression
ist der JSON-String-Ausdruck, path
ist der Pfad zu der Eigenschaft, die Sie aktualisieren möchten, und newValue
ist der neue Wert, der auf diese Eigenschaft angewendet werden soll.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel zur Veranschaulichung.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Ergebnis:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
In diesem Beispiel:
{"Name": "Homer"}
ist der ursprüngliche JSON-String$.Name
ist der Pfad (dieser beginnt mit$.
gefolgt vom Pfad zu der Eigenschaft, die wir aktualisieren möchten).Bart
ist der neue Wert, den wirName
zuweisen möchten (d.h. um den aktuellen Wert zu ersetzen)
Beispiel 2 – Zurückgeben des ursprünglichen und modifizierten JSON
Beachten Sie, dass JSON_MODIFY()
ändert das ursprüngliche JSON nicht. Es nimmt eine Kopie, modifiziert sie und gibt die Kopie zurück.
Hier ist ein Beispiel, um dies zu demonstrieren:
DECLARE @suspect NVARCHAR(4000) SET @suspect= '{"Name": "Homer"}' SELECT @suspect AS 'Original String', JSON_MODIFY(@suspect, '$.Name', 'Bart') AS 'Modified String', @suspect AS 'Original String';
Ergebnis:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Beispiel 3 – Verschachtelte Eigenschaften
Der Pfad kann die Punktnotation verwenden, um auf verschachtelte Eigenschaften zu verweisen. Hier ist ein Beispiel.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Address.City', 'Timaru') AS 'Modified Array';
Ergebnis:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Wir können also sehen, dass die Stadt von Dunedin
geändert wurde zu Timaru
.
Beispiel 4 – Werte in einem Array aktualisieren
Sie können auch Werte innerhalb eines Arrays aktualisieren. In diesem Beispiel aktualisieren wir einen Wert in Hobbies
Array.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies[2]', 'Brain Surgery') AS 'Updated Hobbies';
Ergebnis:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Da Arrays eine nullbasierte Nummerierung verwenden, aktualisieren wir das dritte Element, indem wir auf Hobbies[2]
verweisen .
Beispiel 5 – Einen Wert an ein Array anhängen
In diesem Beispiel hängen wir einen Wert an Hobbies
an Reihe. Wir tun dies, indem wir append
hinzufügen am Anfang des Pfadarguments.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'append $.Suspect.Hobbies', 'Brain Surgery') AS 'Updated Hobbies';
Ergebnis:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Beispiel 6 – Aktualisieren eines ganzen Arrays
In diesem Beispiel aktualisiere ich das gesamte Array.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies', JSON_QUERY('["Chess", "Brain Surgery"]')) AS 'Updated Hobbies';
Ergebnis:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Beachten Sie, dass in diesem Beispiel das dritte Argument an JSON_QUERY()
übergeben wird Funktion. Wenn ich das nicht getan hätte, hätte SQL Server die doppelten Anführungszeichen und eckigen Klammern mit dem umgekehrten Schrägstrich (\
) Zeichen (und damit das Array durcheinander bringt). Dies hätte es getan, weil es nicht gewusst hätte, ob der aktualisierte Wert ein tatsächliches Array oder ein Zeichenfolgenliteral war.
Um dies zu umgehen, können wir also JSON_QUERY()
verwenden . Diese Funktion gibt gültiges JSON zurück und SQL Server geht dann davon aus, dass der neue Wert ein Array ist.
Folgendes wäre passiert, wenn wir es nicht getan hätten verwendet JSON_QUERY()
:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies', '["Chess", "Brain Surgery"]') AS 'Updated Hobbies';
Ergebnis:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Daher hat SQL Server die eckigen Klammern und doppelten Anführungszeichen maskiert.
Beispiel 7 – Aktualisieren eines ganzen Objekts
Hier ist ein Beispiel für die Aktualisierung eines ganzen Objekts.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect', JSON_QUERY('{"Name": "Peter Griffin", "Hobbies": "None"}')) AS 'Updated Object';
Ergebnis:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Nochmal, wenn wir nicht JSON_QUERY()
verwendet hätten , hätten wir einen Escape-String erhalten:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect', '{"Name": "Peter Griffin", "Hobbies": "None"}') AS 'Updated Object';
Ergebnis:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Beispiel 8 – Schlüssel umbenennen
Sie sind nicht nur darauf beschränkt, den Wert einer Eigenschaft zu aktualisieren, Sie können auch ihren Schlüssel umbenennen. Hier ist ein Beispiel.
DECLARE @data NVARCHAR(50)='{"Name":"Homer"}' PRINT @data -- Rename the key SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')), '$.Name', NULL ) PRINT @data
Ergebnis:
{"Name":"Homer"} {"Handle":"Homer"}
Hier nehmen wir den Wert aus der vorhandenen Eigenschaft und weisen ihn einem neuen Schlüssel/Wert-Paar zu. Wir setzen dann den Wert des ursprünglichen Schlüssels auf NULL
(was es automatisch löscht).
Weitere Beispiele zum Umbenennen eines Schlüssels finden Sie unter Umbenennen eines JSON-Schlüssels in SQL Server.