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 d'une colonne avec plusieurs REPLACE en une seule opération


Sujet :

Développement SQL Server

  1. #1
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 363
    Points
    363
    Par défaut UPDATE d'une colonne avec plusieurs REPLACE en une seule opération
    Je me suis un peu gratté la tête pour le titre .... sans trouver quelque chose de très parlant

    Par contre le descriptif du problème est tout simple. Je souhaite faire un UPDATE avec une formule de type REPLACE sur une colonne de type string. Jusqu'à là, rien de plus simple. Là où ça se complique, c'est qu'il y aurait plusieurs REPLACE à faire en même temps pour une même ligne.

    L'exemple suivant est donné juste à titre indicatif et simplificateur, il ne reflète en rien l'objectif final qui est tout autre.

    Soit la table COMMANDE avec une colonne NUMERO qui est l'identifiant unique et LISTE_ARTICLE qui contient une concaténation des codes Articles contenus dans la commande, séparés par un ';'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE COMMANDE (NUMERO AS INT, LISTE_ARTICLES as VARCHAR(MAX))
    INSERT INTO COMMANDE SELECT 1, 'blablabla....#A3;A2;A4;A1# ......blablabla'
    où A1, A2, etc. sont des codes articles contenus donc dans la commande n°1.

    Soit la table ARTICLESARETIRER qui contient une liste des articles à retirer par commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE ARTICLESARETIRER (NUMERO AS INT, ARTICLE AS CHAR(2) )
    INSERT INTO ARTICLESARETIRER SELECT 1, 'A1'
    INSERT INTO ARTICLESARETIRER SELECT 1, 'A3'
    Donc le but serait de faire un UPDATE sur COMMANDE pour retirer de façon ensembliste et en une seule fois A1 et A3 de la commande n°1 (et donc obtenir 'blablabla....#A2;A4# ......blablabla') à partir de la table ARTICLESARETIRER. Sachant que je dois obligatoirement utiliser un REPLACE car je ne suis pas à même de reconstruire la colonne LISTE_ARTICLE en excluant simplement les valeurs de la table ARTICLESARETIRER.
    Or actuellement je ne sais faire qu'en utilisant un curseur
    Merci d'avance pour vos suggestions.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FMJ Voir le message
    Soit la table COMMANDE avec une colonne NUMERO qui est l'identifiant unique et LISTE_ARTICLE qui contient une concaténation des codes Articles contenus dans la commande, séparés par un ';'.
    Belle modélisation de merde...
    Jamais entendu parler des tables de croisements ?
    Change tout de suite ça !

    Regarde ça, ça pourrait t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- PARSE D'UNE CHAINE DE CARACTÈRES AVEC SÉPARATEUR
    DECLARE @t TABLE ( id int primary key, val VARCHAR(50) );
    INSERT @t VALUES (1, '1t1to;titi1;1tu1tu1;1tata'),(2,'titi22;toto2;tat2a');
    ; WITH CTE AS ( SELECT id, CAST('<c>' + REPLACE(val, ';','</c><c>') + '</c>' AS XML) AS val_xml FROM @t )
    	SELECT CTE.id , T.C.value('(./text())[1]','VARCHAR(MAX)') AS val FROM CTE CROSS APPLY val_xml.nodes('//c') AS T(C)

  3. #3
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 363
    Points
    363
    Par défaut
    Salut et merci pour ta réponse. Dont je vais essayer de mieux comprendre le code ... J'avais regardé il y a peu les CROSS APPLY, concluant un peu hâtivement que cela ne me serait d'aucune utilité ...

    En fait je ne peux rien changer : c'est le MCD d'un ERP, je dois faire avec. Je ne peux pas reconstituer la valeur de LISTE_ARTICLES comme je le souhaiterais car ... elle est formatée en RTF. Autant dire que c'est imbitable : je ne peux pas me fier à mes balises de délimitation et de séparation : elles peuvent être moyées dans les balises RTF. Donc le REPLACE est beaucoup plus indiqué.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Ils sont quand même forts ces commerciaux pour réussir à vendre des produits avec un modèle de données aussi m#@%ique !

  5. #5
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 363
    Points
    363
    Par défaut
    Et ça c'est rien. Pour rappel la plus grosse table qui contient des millions de lignes a ..... 215 colonnes !!!!! Pas beau ça !
    Et quand on modifie une quantité d'une ligne d'une pièce contenant des centaines d'autres lignes, UPDATE ils ne connaissent pas --> Ils font un DELETE global sur la pièce puis un INSERT INTO pour chaque ligne.
    Pas belle la vie ???!!!!

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Sans compter qu'avec 215 colonnes, il y a probablement un grand nombre d'index, delete + insert dans ce contexte c'est encore pire

Discussions similaires

  1. [XL-2010] Trouver une date (mois et année) dans une colonne avec plusieurs dates
    Par merlinus3000 dans le forum Excel
    Réponses: 9
    Dernier message: 07/06/2015, 08h34
  2. update d'une seule colonne table entière
    Par dlamo dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/10/2007, 10h13
  3. Colonne avec plusieurs typages ?
    Par ctobini dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 21/09/2007, 16h24
  4. Plusieur Update en une seule requete?
    Par sirbaldur dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/06/2006, 13h13
  5. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 13h57

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