Dans SQL Server, vous pouvez utiliser T-SQL JSON_MODIFY()
fonction pour modifier la valeur d'une propriété dans une chaîne JSON. La fonction renvoie la chaîne JSON mise à jour.
Syntaxe
La syntaxe ressemble à ceci :
JSON_MODIFY ( expression , path , newValue )
Où expression
est l'expression de chaîne JSON, path
est le chemin d'accès à la propriété que vous souhaitez mettre à jour, et newValue
est la nouvelle valeur à appliquer à cette propriété.
Exemple 1 - Utilisation de base
Voici un exemple pour illustrer.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Résultat :
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
Dans cet exemple :
{"Name": "Homer"}
est la chaîne JSON d'origine$.Name
est le chemin (il commence par$.
suivi du chemin d'accès à la propriété que nous voulons mettre à jour).Bart
est la nouvelle valeur que nous voulons attribuer àName
(c'est-à-dire pour remplacer la valeur actuelle)
Exemple 2 - Renvoyer le JSON d'origine et modifié
Notez que JSON_MODIFY()
ne modifie pas le JSON d'origine. Il prend une copie, puis modifie et renvoie la copie.
Voici un exemple pour illustrer cela :
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';
Résultat :
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Exemple 3 - Propriétés imbriquées
Le chemin peut utiliser la notation par points pour référencer les propriétés imbriquées. Voici un exemple.
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';
Résultat :
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Nous pouvons donc voir que la ville a été modifiée de Dunedin
à Timaru
.
Exemple 4 - Mettre à jour des valeurs dans un tableau
Vous pouvez également mettre à jour des valeurs dans un tableau. Dans cet exemple, nous mettons à jour une valeur dans le Hobbies
tableau.
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';
Résultat :
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Étant donné que les tableaux utilisent une numérotation à base zéro, nous mettons à jour le troisième élément en faisant référence à Hobbies[2]
.
Exemple 5 - Ajouter une valeur à un tableau
Dans cet exemple, nous ajoutons une valeur au Hobbies
déployer. Nous faisons cela en ajoutant append
au début de l'argument du chemin.
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';
Résultat :
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Exemple 6 - Mettre à jour un tableau entier
Dans cet exemple, je mets à jour tout le tableau.
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';
Résultat :
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Notez que dans cet exemple, le troisième argument est passé au JSON_QUERY()
une fonction. Si je ne l'avais pas fait, SQL Server aurait échappé aux guillemets doubles et aux crochets en utilisant la barre oblique inverse (\
) caractère (et donc gâcher le tableau). Il aurait fait cela car il n'aurait pas su si la valeur mise à jour était un tableau réel ou un littéral de chaîne.
Donc, pour contourner cela, nous pouvons utiliser JSON_QUERY()
. Cette fonction renvoie un JSON valide, et SQL Server supposera alors que la nouvelle valeur est un tableau.
Voici ce qui se serait passé si nous ne l'avions pas fait utilisé 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';
Résultat :
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
SQL Server a donc échappé aux crochets et aux guillemets doubles.
Exemple 7 - Mettre à jour un objet entier
Voici un exemple de mise à jour d'un objet entier.
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';
Résultat :
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Encore une fois, si nous n'avions pas utilisé JSON_QUERY()
, nous aurions reçu une chaîne échappée :
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';
Résultat :
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Exemple 8 - Renommer une clé
Vous n'êtes pas limité à la mise à jour de la valeur d'une propriété, vous pouvez également renommer sa clé. Voici un exemple.
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
Résultat :
{"Name":"Homer"} {"Handle":"Homer"}
Ici, nous prenons la valeur de la propriété existante et l'attribuons à une nouvelle paire clé/valeur. Nous définissons ensuite la valeur de la clé d'origine sur NULL
(ce qui le supprime automatiquement).
Pour plus d'exemples de renommage d'une clé, consultez Comment renommer une clé JSON dans SQL Server.