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

MS SQL Server Discussion :

[SQLS2K5] Majuscules à chaque mot d'une chaine de plusieurs mot.


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut [SQLS2K5] Majuscules à chaque mot d'une chaine de plusieurs mot.
    Bonjour,
    J'aimerais mettre à jour une table dans ma base de donnée.
    J'aimerais transformer un champ en mettant systématiquement la première lettre en majuscule. Évidement jusqu'ici pas de soucis. C'est simple.
    En revanche lorsque la chaine contient plusieurs mots séparés par des espaces j'aimerais mettre une majuscule à chaque mot et pas seulement au premier.
    Je ne trouve pas comment faire ceci ni quel fonction utiliser pour détecter les espace.

    Si quelqu'un à déjà fait ça... merci.

  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 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Ecrivez une fonction UDF pour ce faire.

    A +

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Je n'ai pas compris , UDF?

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    J'ai rien dit ^^
    Par contre tous les exemples que j'ai ne sont valables que pour le premier mot, nul part je trouve d'exemple pour mettre la première lettre de CHAQUE MOT en majuscule...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Réfléchissez qu'y a t-il comme caractère avant la première lettre d'un mot ?

    Réponse : un caractère non lettre !

    A +

  6. #6
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Oui j'ai bien compris cela, c'est pour ça que jai demandé dans mon premier post la fonction pour détecter un espace.
    LOCATE peut etre?
    J'ai bien compris ce qu'il faut faire mais ce qu'il em faut c'est de l'aide syntaxique.
    D'apres ce que j'ai compris impossible de le faire en requete SQL simple?
    Il faut créer une fonction....?

  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
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Oui, créer une fonction.

    A +

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Voici un script de création et de test de la fonction :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    -- Si la fonction fPremiereLettreMajuscule existe, on la supprime
    IF EXISTS
    (
    	SELECT TOP 1 1
    	FROM sys.objects
    	WHERE name = 'fPremiereLettreMajuscule'
    	AND TYPE = 'FN'
    )
    DROP FUNCTION fPremiereLettreMajuscule
    GO
     
    -- Creation de la fonction de mise en majuscule de la première lettre de tous les mots d'une phrase
    CREATE FUNCTION fPremiereLettreMajuscule (@str VARCHAR(8000))
    	RETURNS VARCHAR(8000)
    AS
    BEGIN
    	DECLARE @result VARCHAR(8000);
     
    	-- Extraction des mots de la phrase par recherche des espaces
    	WITH
    		CTE_Espaces AS
    		(
    				SELECT 1 Deb, CHARINDEX(' ', @str + ' ') Fin
    			UNION ALL
    				SELECT Fin + 1, CHARINDEX(' ', @str + ' ', Fin + 1)
    				FROM CTE_Espaces
    				WHERE CHARINDEX(' ', @str + ' ', Fin + 1 ) > 0
    		)
    	-- Formatage des mots et concaténation
    	SELECT @result = ISNULL(@result, '') + UPPER(SUBSTRING(SUBSTRING(@str, Deb, Fin), 1, 1)) + LOWER(SUBSTRING(SUBSTRING(@str, Deb, Fin - Deb + 1), 2, Fin))
    	FROM CTE_Espaces
     
    	RETURN @result
    END
    GO
    ---------
    -- TEST -
    ---------
    -- Suppression de la table TbPhrases si elle existe
    IF EXISTS
    (
    	SELECT TOP 1 1
    	FROM sys.objects
    	WHERE name = 'TbPhrases'
    	AND TYPE = 'U'
    )
    DROP TABLE TbPhrases
    GO
     
    -- Creation de la table de test
    CREATE TABLE TbPhrases 
    (
    	Phrase VARCHAR(8000)
    )
    GO
     
    -- Creation des données de test
    INSERT INTO dbo.TbPhrases VALUES ('bonjour djaiffe')
    INSERT INTO dbo.TbPhrases VALUES ('coucou sqlpro')
    INSERT INTO dbo.TbPhrases VALUES ('adiou elsuket')
    INSERT INTO dbo.TbPhrases VALUES ('hello developpez ;)')
    GO
     
    -- Mise en majuscule de la première lettre de tous les mots des phrases stockées dans dbo.TbPhrases
    UPDATE dbo.TbPhrases
    SET Phrase = dbo.fPremiereLettreMajuscule(Phrase)
    GO
     
    -- Resultat
    SELECT Phrase
    FROM dbo.TbPhrases
    Je ne suis pas parvenu à me passer de @result dans le corps de la fonction

    A+

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Quelques petites erreurs elsuket sur ta fonction. En voici une itérative (qui ira sans doute plus vite :

    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
    27
    28
    CREATE FUNCTION dbo.F_INITCAP (@PHRASE VARCHAR(max))
    RETURNS VARCHAR(max)
    WITH RETURNS NULL ON NULL INPUT
    AS
    BEGIN
       IF @PHRASE = '' RETURN @PHRASE
       DECLARE @I INT, @C CHAR(1), @P BIT, @OUT VARCHAR(max)
       SELECT @I = 1, @P = 0, @OUT = ''
       WHILE @I <= LEN(@PHRASE)
       BEGIN
          SET @C = SUBSTRING(@PHRASE, @I, 1)
          IF @C BETWEEN 'A' AND 'Z' COLLATE French_CI_AI
          BEGIN
             IF @P = 0
                SET @OUT = @OUT + UPPER(@C)
             ELSE 
                SET @OUT = @OUT + LOWER(@C)
             SET @P = 1
          END
          ELSE
          BEGIN
             SET @P = 0
             SET @OUT = @OUT + LOWER(@C)
          END
          SET @I = @I + 1
       END
       RETURN @OUT
    END
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- exemple : 
    SELECT dbo.F_INITCAP ('Le tire-bouchon d''habitude est posé sur la table à papa')
     
    Le Tire-Bouchon D'Habitude Est Posé Sur La Table À Papa
    A +

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Quelques petites erreurs elsuket sur ta fonction
    Ne me laisses pas dans l'ignorance !

    qui ira sans doute plus vite
    OK, j'aurais pensé l'inverse ...

  11. #11
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Merci Messieurs.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/06/2015, 11h01
  2. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  3. Recherche de plusieurs mots dans une chaine
    Par Thib6670 dans le forum C#
    Réponses: 3
    Dernier message: 30/06/2011, 15h19
  4. Réponses: 0
    Dernier message: 31/05/2011, 18h59
  5. [RegEx] mettre en majuscule chaque mot d'une chaine
    Par bigs3232 dans le forum Langage
    Réponses: 9
    Dernier message: 20/05/2010, 09h48

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