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 :

Changement d'une chaine de caracteres d'une colonne sans modification de ce qui se trouve avant ou après cette


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut 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 Expert Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Par défaut
    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

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    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 Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    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
    Futur Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    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 Expert Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Par défaut
    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 ...

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Dans votre cas, REPLACE fonctionne tout à fait. Sans doute l'avez vous mal utilisé !

    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/ * * * * *

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 654
    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 654
    Billets dans le blog
    10
    Par défaut
    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

    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,

    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
    Futur Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    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

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    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 +
    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/ * * * * *

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2013, 00h30
  2. Réponses: 2
    Dernier message: 26/11/2008, 15h37
  3. [VBA-E] Suppression du contenu d'une colonne sans perdre ses formules
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/04/2007, 09h08
  4. Récupérer valeurs d'une colonne sans doublons
    Par paflolo dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 17/10/2006, 14h19
  5. Réponses: 4
    Dernier message: 10/06/2006, 00h38

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