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 :

[Débutant] Faire en sorte que le nom commence par majuscule


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut [Débutant] Faire en sorte que le nom commence par majuscule
    Bonjour,

    J'ai une base de données SQL Server 05. Je voudrais savoir comment faire pour que lorsque l'utilisateur insère un nom, celui-ci commence par une majuscule (et éventuellement pour que les espaces du début et de la fin soient supprimés).
    Est-ce au moment des CREATE TABLE qu'il faut spécifier ces contraintes ? Ou est-ce possible de faire en sorte que la correction se fasse automatiquement lors de l'INSERT ?

    Merci de votre aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Salut,

    Ca devrait le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    declare @nom varchar(255)
    set @nom = '  testTTT  '
     
    select rtrim(upper(substring(ltrim(rtrim(@nom)),1,1)) + lower(substring(ltrim(rtrim(@nom)), 2, len(ltrim(rtrim(@nom))) - 1)))

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse.
    Je voulais juste savoir : où mettre ce genre de code ? Dans les Create Table, les fonctions, ou les triggers ?
    Merci.

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Le plus propre pour moi serait de créer une fonction - soit sql server - soit application - qui converti ta chaine de caractere au format souhaité lorsque tu fais un insert/update.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    D'accord.
    Je pense devoir faire la fonction du côté de l'application (en JSP).
    Enfin j'aurais aimé la faire aussi du côté de SQL Server mais je ne sais pas trop comment entrer une fonction, et comment faire en sorte qu'elle s'exécute avant chaque INSERT.

  6. #6
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Pour créer une fonction :
    Lance query analyser, appuye sur F1 et cherche dans l'index : CREATE FUNCTION

    Pour créer un trigger :
    Toujours dans l'aide, tu cherche dans l'index : create trigger

    En mettant les 2 ensembles tu devrais pouvoir y arriver...

  7. #7
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Merci.
    Par contre je ne sais pas ce qu'est Query Analyser. Je dois le télécharger ? Car je n'ai que SQL Management Studio et Visual Studio 2005. Dans SQL MS, j'ai DMX Analysis request, MDX Analysis request et XMLA Analysis request.

    Enfin dans SQL Management, j'ai quand même dans l'arborescence un répertoire Fonctions. Je choisis donc Fonction table ?
    Encore merci.

    EDIT : J'ai bien réussi à créer la fonction, grâce à ton aide.
    J'ai fait un clic droit sur fonction, et je l'ai créée ainsi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE FUNCTION Nom_guillemet(@nom AS NVARCHAR(30)) 
    RETURNS NVARCHAR(500)
    BEGIN
    DECLARE @RESULTAT NVARCHAR(30)
    SELECT @RESULTAT = rtrim(upper(substring(ltrim(rtrim(@nom)),1,1)) + lower(substring(ltrim(rtrim(@nom)), 2, len(ltrim(rtrim(@nom))) - 1)))
    RETURN @RESULTAT
    END

    Maintenant, dans les CREATE Table, lorsque je fais par exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.Nom_guillemet(' test');

    Cela m'affiche le bon résultat.
    Par contre dans le trigger, je ne sais pas comment indiquer la colonne Nom de ma table client.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Bon et bien apparemment, j'ai ce que je voulais. Les noms insérés commencent maintenant par une majuscule, et il n'y a plus d'espaces au début ou à la fin.

    Voici le code de la fonction de Ptit_Dje, qui fonctionne apparemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE FUNCTION Nom_guillemet(@nom AS NVARCHAR(30)) 
    RETURNS NVARCHAR(500)
    BEGIN
    DECLARE @RESULTAT NVARCHAR(30)
    SELECT @RESULTAT = rtrim(upper(substring(ltrim(rtrim(@nom)),1,1)) + lower(substring(ltrim(rtrim(@nom)), 2, len(ltrim(rtrim(@nom))) - 1)))
    RETURN @RESULTAT
    END
    La fonction s'affiche comme étant une fonction scalaire. Est-ce normal ?

    Et voici le trigger, que j'ai placé avec les CREATE TABLE :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER Nom_insert ON Client FOR INSERT
    AS
    UPDATE Client SET Client.Nom = dbo.Nom_guillemet(Nom)
    GO

    Est-ce que ça vous semble correct ? Car c'est mon tout 1er trigger avec SQL Server, et je voudrais en faire d'autres. Je dois continuer avec le même principe ?

  9. #9
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Tout d'abord, concernant la fonction :

    Pourquoi retourner un Nvarchar de 500 caracteres alors que tu n'acceptes en parametre qu'un Nvarchar 30 ?

    Si tu travailles avec du Nvarchar, il ne faut pas te soucier d'éliminer les espaces qui se trouvent à droite du nom.
    En effet, le bout de code suivant te montrera qu'ils sont eliminés directement :
    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
     
    create table tVarchar
    (
    	value nvarchar(10)
    )
     
     
    insert into tVarchar
    select '123  '
    union
    select '  123'
    union
    select '123'
     
     
    select * from tVarchar
     
    select value, len(value) from tVarchar
    C'est ce qui différencie le char du varchar.


    Pour le trigger, j'écrirais plutot quelque chose de la sorte (fonctionne avec l'exemple cité ci dessus) (sans tenir compte du fait qu'on ai créer une fonction):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER Nom_insert ON tVarchar instead of INSERT
    AS
    insert into tVarchar
    select rtrim(upper(substring(ltrim(rtrim(value)),1,1)) + lower(substring(ltrim(rtrim(value)), 2, len(ltrim(rtrim(value))) - 1)))
    from inserted

    Note que pour savoir si c'est correct ou pas, il te suffit de faire de petits tests et tu verras tout de suite si ca fonctionne ou pas.


    A noter que tu dois bien entendu adapter ca à ta table.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup pour tes indications. Je ne savais pas que le nVarchar avait cet avantage de supprimer les espaces à la fin, j'ai vérifié et c'est bien le cas.

    Pour le NVARCHAR(500), un petit oubli de ma part, j'ai corrigé ça.

    Pour le trigger, je suppose que je peux supprimer les rtrim et laisser les ltrim, ou bien je laisse les 2 par sécurité ?
    Et aussi, pour adapter le code à ma table, sachant que ma table contient une quinzaine de champs, je ne sais pas comment rajouter les autres.

    Je bloque sur ce script :

    Code SQL : 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
    CREATE TABLE tVarchar2
    (
    	value nvarchar(10),
    	value2 nvarchar(10)
    )
    go
    CREATE TRIGGER Nom_insert ON tVarchar2 instead of INSERT
    AS
    INSERT INTO tVarchar2 values
    SELECT rtrim(upper(substring(ltrim(rtrim(value)),1,1)) + lower(substring(ltrim(rtrim(value)), 2, len(ltrim(rtrim(value))) - 1)))
     
    select values2
    FROM inserted
    GO
     
    insert into tVarchar2 values('  nom_espace', 'test');

    Merci.

  11. #11
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    1°) Pour la fonction, tu peux en effet la fine tuner afin qu'elle soit + performante. Si tu enleves les rtrim, ca evite des appels à une fonction qui sont inutiles... Il y a peut etre d'autres modif à faire encore.

    2°) Pour le trigger tu dois considerer le mot clé inserted comme une table.
    En gros ton trigger dis à SQL serveur en francais :
    A la place d'inserer (instead of insert) dans la table tVarchar2 les données qui te sont passées, insère dans cette même table les valeurs qui te sont passée mais pour le champs value, passe d'abord sa valeur par la fonction "mettre une majuscule"
    Ce qui pourrait se traduire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TRIGGER Nom_insert ON tVarchar2 instead of INSERT
    AS
     
    INSERT INTO tVarchar2(value, value2)
    SELECT dbo.FonctionMajuscule(value), value2 
    FROM inserted
     
    GO
    Voila, je n'ai pas testé ce code, mais c'est l'idée.
    Bonne chance.

  12. #12
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Ah merci beaucoup ! Ca fonctionne ! Tout est nickel, il me manque plus qu'à voir la fonction en question.

    Franchement, merci beaucoup Ptit_Dje, tu m'as été d'un grand secours. Pour les prochains triggers j'aurai moins de soucis maintenant. Je commence à comprendre le fonctionnement.

    Encore merci, et bonne fin de journée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/02/2010, 17h24
  2. Réponses: 1
    Dernier message: 10/10/2008, 16h23
  3. Comment faire en sorte que le prog se fasse répéter
    Par LeonHONORE dans le forum Pascal
    Réponses: 3
    Dernier message: 20/04/2008, 21h41
  4. Réponses: 3
    Dernier message: 17/05/2007, 19h30
  5. Réponses: 4
    Dernier message: 02/09/2006, 19h41

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