Bonjour à tous,
le principe de ma requête consiste à récupérer un champ xml d'une base de données SQL et remplacer une chaine par une autre dans ce champ xml.
Dans mon exemple le mot "Dormant" est remplacer par "Dt"
Dans un 1er temps je récupére tous les champs contenant ma chaine a remplacer puis je les stocke dans la table "Descr" avec les colonnes "Descr_Old" (ancien descriptif) et "Descr_New" (Nouveau descriptif)
Cette partie de la requête fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 USE WM2016; BEGIN; DECLARE @NewValue Varchar(255); --SET @NewValue = 'Test'; WITH Descr AS ( SELECT Description.value('(//Value/text())[1]', 'varchar(40)') AS Descr_Old ,REPLACE(Description.value('(//Value/text())[1]', 'varchar(40)'), 'Dormant', 'Dt') AS Descr_New FROM [WM2016].[dbo].[WMProduct] WHERE LongDescription.value('(//Value/text())[1]', 'varchar(40)') LIKE '%Dormant%' )
Dans un second temps je souhaite réécrire le champ xml en remplaçant l'ancien descriptif par le nouveau.
En assemblant ces 2 codes, vous avez l'intégralité de ma requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 UPDATE WMProduct SET @NewValue = Descr.Descr_New, Description.modify ( 'replace value of (//Value/text())[1] with sql:variable("@NewValue")' ) FROM Descr WHERE Description.value('(//Value/text())[1]', 'varchar(40)') = Descr_Old --SELECT @NewValue END;
Mon problème : La variable @NewValue est pas affecté par "SET @NewValue = Descr.Descr_New", le reste de la requête fonctionne.
Quand j'active la ligne "SET @NewValue = 'Test';" au début :
@NewValue prend la valeur "Test" et est assigné à tous les champs "Description"
Si j'active aussi le SELECT "@NewValue" à la fin, sa valeur correspond bien au résultat que je souhaite.
J’espère avoir été clair.
Partager