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

  1. #1
    Nouveau Candidat au Club
    Changement d'une chaine de caracteres d'une colonne sans modification de ce qui se trouve avant ou après cette
    Bonjour,
    Je débute en SQL et je rencontre des difficultés pour une requête.
    Je dois mettre à jour une chaîne de caractère de ma colonne MESSAGE dans tous les enregistrements de ma table TEST.
    Cette chaîne de caractères à modifier est la même pour tous les enregistrements.
    il ne faut absolument pas, que ce qui se trouve avant ou après cette chaine, soit modifié. Tout en sachant que tout ce qui se trouve avant et après est différent pour chaque enregistrement de ma colonne.
    J'ai bien essayé un UPDATE avec un REPLACE, mais le REPLACE a pour effet de tout remplacer, ce que je ne veux pas.
    J'utilise SQL Server compact Toolbox for runtine 3.5
    Par avance, merci de votre aide

  2. #2
    Membre chevronné
    Bonjour,
    On peut jouer avec les fonction locate/instr et substring ...
    Maintenant est ce qu'il y peut y avoir plusieurs occurrences de la sous-chaîne à remplacer dans la chaîne initiale ?

    Est-ce que c'est une manip à faire une fois ou régulièrement
    Il ne pleut jamais en Moselle !

  3. #3
    Nouveau Candidat au Club
    Bonjour

    Et merci pour votre réponse.
    alors l'idée,était de faire une requête en 1 seule fois car j'ai à peu prés 1000 enregistrements à modifier.
    J'avais essayé une requête avec SUBSTRING pour lui indiquer la position des caractères à modifier :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    UPDATE [TEST] SET MESSAGE = 'Nouvelle_Valeur' + SUBSTRING (MESSAGE, 122, 49)
    WHERE SUBSTRING (MESSAGE, 122, 49) = '%Ancienne_valeur%';


    Mais cela supprime tout ce qu'il y a avant et après.

    La valeur à remplacer est vraiment la même pour les 1000 enregistrements de ma colonne et se trouve à la même position. Et j'ai juste cette valeur à changer.
    Ce qui est différent est ce qui se trouve avant et après cette valeur.

  4. #4
    Membre confirmé
    Bonjour,

    C'est du Oracle ou du SQL Server?
    Dans Oracle REPLACE ou REGEXP_REPLACE peut convenir. Par exemple, si 'chaine_a_remplacer' est unique dans MESSAGE:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    UPDATE TEST SET MESSAGE = REPLACE(MESSAGE, 'chaine_a_remplacer', 'nouvelle_chaine')
    WHERE INSTR (MESSAGE, 'chaine_a_remplacer') > 0;

  5. #5
    Nouveau Candidat au Club
    Merci.
    J'utilise SQL Server Compact Edition.
    J'obtiens cette erreur :
    Message : La fonction n'est pas reconnue par SQL Server Compact Edition. [ Name of function = INSTR,Data type (if known) = ]
    Minor Err.: 25921
    Source : SQL Server Compact ADO.NET Data Provider
    Err. Par. : INSTR

  6. #6
    Membre chevronné

    In Oracle, INSTR function returns the position of a substring in a string, and allows you to specify the start position and which occurrence to find.

    In SQL Server, you can use CHARINDEX function that allows you to specify the start position, but not the occurrence, or you can use a user-defined function.
    Essayer charindex ...
    Il ne pleut jamais en Moselle !

  7. #7
    Rédacteur

    Dans votre cas, REPLACE fonctionne tout à fait. Sans doute l'avez vous mal utilisé !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  8. #8
    Nouveau Candidat au Club
    Bonjour,

    Citation Envoyé par SQLpro Voir le message
    Dans votre cas, REPLACE fonctionne tout à fait. Sans doute l'avez vous mal utilisé !

    A +
    Etant débutante en SQL, c'est tout à fait possible...
    J'avais utilisé le REPLACE comme ceci mais cela avait effacé tout ce qui se trouvait avant et après
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE [TEST]
    SET MESSAGE = REPLACE ('chaîne_à_remplacer,'','Nouvelle_chaîne')
    WHERE MESSAGE LIKE 'chaîne_à_remplacer';
    GO


    @vttman
    Je vais regarder de ce coté là (CHARINDEX)

  9. #9
    Expert éminent sénior
    Bonjour,

    L'opérateur LIKErequiert l'utilisation d'un wildcard "%" ou "_"

    WHERE MESSAGE LIKE 'chaîne_à_remplacer';.

    à remplacer par

    WHERE MESSAGE LIKE '%chaîne_à_remplacer%';.

  10. #10
    Modérateur

    Bonjour,

    Citation Envoyé par Simba67 Voir le message

    J'avais utilisé le REPLACE comme ceci mais cela avait effacé tout ce qui se trouvait avant et après
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE [TEST]
    SET MESSAGE = REPLACE ('chaîne_à_remplacer,'','Nouvelle_chaîne')
    WHERE MESSAGE LIKE 'chaîne_à_remplacer';
    GO

    Donc en effet, mal utilisé !
    Essayez comme ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE [TEST]
    SET MESSAGE = REPLACE (MESSAGE ,'chaîne_à_remplacer','Nouvelle_chaîne')
    WHERE MESSAGE LIKE '%chaîne_à_remplacer%';
    GO

  11. #11
    Nouveau Candidat au Club
    Bonjour à tous,

    J'ai enfin réussi à me dépatouiller.
    J'ai surtout compris pourquoi je rencontrais autant de difficultés. J'avais omis de vous préciser que ma colonne était en en ntext, j'en suis désolée.
    Quand je vous disais que j'étais débutante, ce n'était pas un mensonge.
    Donc vous aviez raison, le REPLACE aurait du fonctionner correctement.
    Effectivement, cela parait beaucoup plus simple, une fois que l'on a les bonnes informations.
    Voici la requête
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE [TEST]
    SET MESSAGE = cast (REPLACE(CAST(MESSAGE AS nvarchar(1000)),'Nouvelle_Valeur') as ntext)
    WHERE MESSAGE LIKE '%Ancienne_Valeur%';
    GO

    Je me suis aidée ici http://www.sidesofmarch.com/2008/02/...in-sql-server/
    Encore merci à vous tous pour votre aide

  12. #12
    Rédacteur

    Le type ntext est obsolète depuis la version 2005 de SQL Server. Il faut le changer en NVARCHAR(max). De même pour les types text et image :
    https://docs.microsoft.com/fr-fr/sql...l-server-ver15
    "
    IMPORTANT ! Les types de données ntext, text et image seront supprimés dans une future version de SQL Server. Évitez d'utiliser ces types de données dans un nouveau développement. Prévoyez de modifier les applications qui les utilisent actuellement. Utilisez plutôt les types de données nvarchar(max), varchar(max)et varbinary(max) .
    "

    Un ALTER TABLE peut le faire sans problème :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE MonSchemaSQL.MaTable
       ALTER COLUMN MaColonneNText NVARCHAR(max);


    D'autre part, à moins que vos données soient codées avec des alphabets non latin, grecs ou cyrilliques, par exemple en hébreu, arabe, chinois... il est stupide d'utiliser du NChar/NVarchar qui utilise deux fois plus d'octets pour stocker la même information... Prévoyez du Char/Varchar...

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

###raw>template_hook.ano_emploi###