IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

UPDATE SET @Variable DML_XML


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut UPDATE SET @Variable DML_XML
    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)
    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%'
    )
    Cette partie de la requête fonctionne.

    Dans un second temps je souhaite réécrire le champ xml en remplaçant l'ancien descriptif par le nouveau.
    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;
    En assemblant ces 2 codes, vous avez l'intégralité de ma requête.

    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.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 995
    Billets dans le blog
    6
    Par défaut
    Ce n'est pas du tout comme cela qu'il faut faire. Il faut utiliser la méthode modify appliquée au XML contenu dans la colonne visée.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

    En particulier en utilisant l'option "replace value of" :
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Je ne vois pas la différence entre les liens que tu m'as fourni et mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- update attribute value  
    SET @myDoc.modify('  
      replace value of (/Root/Location/@LaborHours)[1]  
      with     "100.0"  
    ');  
    SELECT @myDoc;
    Le @myDoc correspond à ma colonne "Description"
    Et la valeur "100" correspond à ma variable "@Descr_New" qui change en fonction de l'enregistrement en cours de traitement.
    Sachant que le code de modification du xml fonctionne, c'est juste l'assignation de la valeur à "@Descr_New" qui ne fonctionne pas.

    Pour info, voici le contenu du champ xml si ça peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Value xml:lang="fr">Test</Value>
    </Description>

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 995
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par blooop Voir le message
    Je ne vois pas la différence entre les liens que tu m'as fourni et mon code :
    Excuse moi j'ai été un peu rapide....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    L'ordre d'application des modification n'est pas nécéssairement l'ordre dans lequel elles sont ecrites...

    pourquoi ne pas mettre à jour directement depuis le contenu de la colonne ?

    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
    17
    18
    19
    20
    21
    22
    23
     
    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
    		WMProduct
    	WHERE
    		LongDescription.value('(//Value/text())[1]', 'varchar(40)') LIKE '%Dormant%'
    ) 
    UPDATE WMProduct
    SET @NewValue = Descr.Descr_New , Description.modify
    (
    	'replace value of (//Value/text())[1]
    	with sql:column("Descr.Descr_New")'
    )
    FROM Descr
    WHERE
    	Description.value('(//Value/text())[1]', 'varchar(40)') = Descr_Old
     
    	--SELECT @NewValue
    END;

  6. #6
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Pour la simple raison que je ne connaissais pas le "sql:column".

    C'est une 1ere pour moi en DML_XML et j'ai eu tendance à me focaliser sur l'utilisation de la variable.

    En tout cas, ça fonctionne.

    Merci, c'est cool.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Au cas ou, le code complet :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    USE WM2016;
    BEGIN;
    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%'
    )
     
    UPDATE WMProduct
    SET Description.modify
    (
    	'replace value of (//Value/text())[1]
    	with sql:column("Descr.Descr_New")'
    )
    FROM
            Descr
    WHERE
    	Description.value('(//Value/text())[1]', 'varchar(40)') = Descr_Old
     
    END;
    J'avoue éprouver une certaine frustration à ne pas avoir réussi à utiliser ma variable, je comprend le concept de "L'ordre d'application des modification n'est pas nécéssairement l'ordre dans lequel elles sont ecrites..." mais je n'ai pas trouvé le moyen d'assigner la variable avant de modifier mon descriptif et ça ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PDO UPDATE avec un SET variable
    Par Ophiucus02 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/02/2016, 12h24
  2. [INTERBASE][UPDATE SET WHERE] problème de requete
    Par exclusif dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/03/2006, 21h10
  3. Réponses: 2
    Dernier message: 02/12/2005, 17h40
  4. [MySQL] Update de variable
    Par tyarak dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/10/2005, 02h59
  5. [CGI]problème update de variable de session
    Par LE NEINDRE dans le forum Web
    Réponses: 1
    Dernier message: 18/10/2005, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo