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 :

[SQL 2005] AutoIncrement sur colonne nvarchar


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Par défaut [SQL 2005] AutoIncrement sur colonne nvarchar
    Bonjour,



    Je dois générer automatiquement un identifiant qui ira de AAA000 à ZZZ999.

    Je pourrais très bien le faire dans le code, mais celà implique
    - allez chercher le 1er enregistrement si je classe par ordre décroissant.
    - générer l'id.
    - l'insérer.

    Tout celà en gèrant les transactions pour éviter tout problème.

    Je me demandais si ce travail pouvait être fait automatiquement sous SQL (Procédure Stoquée). Ce qui m'éviterait les allés-venues entre SQL et mon programme.

    Si vous avez une idée des fonctions qui pouraient m'être util ca m'aiderait déjà bien je pense.


    Et question bonus; peut-on mettre comme default value d'une colonne le nom d'une procédure stoquée?


    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Par défaut Re
    Bonjour,
    Si j'ai bien compris ton pb, il est possible de passer par un trigger et une table où il serait stocké les séquences.

    le trigger (instead of insert) viens prendre le dernier incrément dans la table de séquences, l'incrémente, fait son insertion dans la table sur laquelle il est attaché puis fini par sauvegarder la valeur qu'il viens d'utiliser dans la table des séquences.

    Plus la peine de se soucier de ce que l'on met dans la colonne incrémenté (null possible d'ailleurs)

    C'est (plus ou moins) la retranscription du principe utilisé par les générateurs en oracle ou en interbase (et d'autres...)

  3. #3
    Membre éprouvé Avatar de Ensiaste2006
    Inscrit en
    Juillet 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 125
    Par défaut
    Je pourrais très bien le faire dans le code, mais celà implique
    - allez chercher le 1er enregistrement si je classe par ordre décroissant.
    - générer l'id.
    - l'insérer.
    pas du tout
    j'ai réaliser un applicatif où je fait l'insértion de ma ligne dans un premier. j'ai un champs IDENTITY qui s'incrémente. je le récupère à travers la requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @@IDENTITY from maTable
    ainsi fait, je met à jour la zone varchar par AA000011 où à 0000011 est le résultat de la dernière requette.

    attends,
    Je parle ici de SQL SERVER 2000, je ne sais pas si @@IDENTITY vit encore dans le 2005

  4. #4
    Membre éclairé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Par défaut
    Ensiaste2006: oui @@IDENTITY existe toujours en Sql2005, mais moi les premiers caractères alphanumériques devront changer, donc pas toujours AAA. Une fois arriver à AAA999, on passe à AAB000.


    phoenix38: Je pense que c'est en effet la bonne solution. Par contre je ne vois pas comment incrémenter cette table de séquence en Sql...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Par défaut re
    voila la partie du trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    BEGIN
      SELECT @vInNEXT_VALUE = CURRENT_VALUE + 1
        FROM SYS_SEQUENCES
       WHERE TABLE_NAME = 'USER_TRACE'
     
      UPDATE SYS_SEQUENCES
         SET CURRENT_VALUE = @vInNEXT_VALUE
       WHERE TABLE_NAME = 'USER_TRACE'
    ...
    et la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table SYS_SEQUENCES
    (
        TABLE_NAME                 VARCHAR(50)            not null,
        CURRENT_VALUE              NUMERIC(11)            not null,
        constraint PK_SYS_SEQUENCES primary key (TABLE_NAME)
    );
    Dans ton cas, au lieu d'un numéric, tu mets un varchar et dans le trigger tu adapte le current_value + 1 par ta formule permettant d'avoir AAA00010

  6. #6
    Membre éclairé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Par défaut
    Merci,


    En fait c'est justement cette incrementation de caractère qui me pose problème.

    Comment passer de AAA à AAB ?

    Coté programme je devrais y arriver mais en Sql c'est une autre histoire


    Si c'est vraiment trop compliqué, je pourrais générer une table ave 2 colonnes: L'identifiant (AAA000 à ZZZ999) et une autre colonne "Utilisé" (bool).


    De cette façon je rempli la table une seule fois, puis par après j'évite les allez-retour.

    Je n'ai plus qu'à modifier le booleen "Utilisé".


    Mais si vous avez la soluce en Sql je suis preneur

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Par défaut Re
    Ah, je n'avais pas compris cela...

    pour séléctionner la lettre suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ', <incrément de lettre>, 1)
    Pour obtenir l'incrément de lettre, là, c'est plus corsé. Une idée qui vaut ce qu'elle vaut :
    Avec un SUBTRING du dernier incrément (ABZ999) insérer, tu sélectionne ta troisième lettre (ici Z)
    si cette lettre = Z (comme par hazard) alors tu prend la lettre d'avant (B) tu passe ton résultat dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ASCII(SUBSTRING(<dernier incrément>, 2, 1)) - 64
    =
    Le résultat donne 2 (B !) + 1 donne la lettre C avec le premier code. Bien entendu, tu remets 'Z' à A
    C'est un peu compliqué, mais c'est le premier truc qui m'est venu...

  8. #8
    Membre éclairé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Par défaut
    Un grand merci...pas encore eu le temps de tester, mais c est la réponse que j'attendais

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

Discussions similaires

  1. [SQL 2005] 2 instances sur une machine physique
    Par Pmatt dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2007, 08h41
  2. Réponses: 8
    Dernier message: 09/02/2007, 12h58
  3. [SQL Server 2005] Recherche sur colonne "Image"
    Par frechy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/09/2006, 18h35
  4. [SQL 2005 SP1] Pb de plage d'index sur une table répliquée
    Par Peck777 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 28/08/2006, 18h55
  5. [sql 2005]: changer le nom d'une colonne dans un table
    Par TheLittle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2006, 15h29

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