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 :

Génération d'une séquence alphanumérique


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut Génération d'une séquence alphanumérique
    Bonjour,
    je dois générer une séquence alphanumérique, unique pour chaque enregistrement d'une base de données.
    cette séquence a le format:

    100AA00

    soit 3 chiffres, 2 lettres, 2 chiffres.

    Y a t'il possiblité de coder un tel compteur en créant une fonction dans SQL server?
    si oui, avez-vous des pistes à me donner?

    d'avance 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
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Utilisez 3 colonnes séparées dont l'une avec un auto incrément voir un compteur calculé en s'inspirant de l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/clefs/
    Pour l'affichage, utilisez une vue.

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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    J'ai trouvé une manière de faire:
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    CREATE PROCEDURE dbo.P_GetNewNumberD(
      @newNumber   varchar(8) OUTPUT
    )
     
    AS
    BEGIN
     
       DECLARE @resTable TABLE(number VARCHAR(8))
       DECLARE @root     VARCHAR(8)
       DECLARE @left     INT
       DECLARE @middle   VARCHAR(2)
       DECLARE @right    VARCHAR(2)
       DECLARE @right1   INT
       DECLARE @right2   INT
       DECLARE @middle1  INT
       DECLARE @middle2  INT
     
       SET @root = (SELECT param_value FROM parameter
                    WHERE param_code = 'newLastNumber')
     
       SET @left = SUBSTRING(@root,1,3)
       SET @middle = SUBSTRING(@root,4,2)
       SET @middle1 = ASCII(@middle)
       SET @middle2 = ASCII(SUBSTRING(@middle,2,1))
       SET @right = SUBSTRING(@root,6,2)
       SET @right1 = SUBSTRING(@root,6,1)
       SET @right2 = SUBSTRING(@root,7,1)
     
    ------------------------------------------------
    -- Increment Right Part of the number
    ------------------------------------------------
       IF @right != 99
        BEGIN
          IF CONVERT(INT,@right1) = 0
            BEGIN
              IF CONVERT(INT,@right2) != 9
                SET @right = '0' + CONVERT(VARCHAR(1),@right + 1)
              ELSE 
              SET @right = @right + 1
            END
          ELSE
            BEGIN
              SET @right = @right + 1
            END
       END
     
    --------------------------------------------------
    -- Increment middle, alphanumeric part of the number
    --------------------------------------------------
       ELSE IF @middle1 + @middle2 != 180
        BEGIN
          IF @middle2 != 90
            SET @middle2 = @middle2 + 1
          ELSE 
            BEGIN
              SET @middle1 = @middle1 + 1
              SET @middle2 = 65
            END
          SET @right = '00'
       END
     
    --------------------------------------------------
    -- Increment left part of the number
    --------------------------------------------------
       ELSE
        BEGIN
          SET @left = @left + 1
          SET @middle1 = 65
          SET @middle2 = 65
          SET @right = '00'
       END
     
       SET @middle = CHAR(@middle1) + CHAR(@middle2)
       SET @root = CONVERT(VARCHAR(3),@left) + @middle + CONVERT(VARCHAR(2),@right)
     
     --------------------------------------------------
       -- Update last number value
       --------------------------------------------------
        UPDATE parameter
           SET param_value = @root
           OUTPUT INSERTED.param_value INTO @resTable
         WHERE param_code = 'newLastNUmberD'
       --------------------------------------------------
       -- Select from the output table
       --------------------------------------------------
       SELECT @new_number = number FROM @resTable
     
       RETURN 0
     
    END

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Beaucoup d'horreur dans ce code :
    1) la comparateur différence s'écrit <> et non =!
    2) utilisez CAST et non CONVERT (plus couteux) lorsqu'il n'y a pas de cosmétique.
    3) laissez RETURN en paix et non à zéro, sinon en cas d'erreur vous ne saurez pas ce qui se passe

    Enfin , je vous souhaite bonne chance pour les performances quand vous aurez quelques GO de données dans vos tables...

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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    J'ai corrigé mon code selon tes critiques. merci, c'est comme ça qu'on s'améliore.
    Seul le return a été laissé avec une valeur de 0.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Ne met pas de return sinon il écrase l'erreur s'il y en as une !

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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/08/2014, 12h10
  2. Problème génération d'une séquence de date
    Par aïtaï_tsubasa dans le forum R
    Réponses: 3
    Dernier message: 03/06/2010, 10h39
  3. génération d'une m-séquence
    Par loulitta dans le forum Signal
    Réponses: 0
    Dernier message: 25/02/2010, 09h48
  4. Passer une séquence en parametre
    Par djousss dans le forum CORBA
    Réponses: 2
    Dernier message: 02/12/2003, 22h39
  5. Extraire une séquence d'un fichier MPEG
    Par enzosp dans le forum DirectX
    Réponses: 2
    Dernier message: 24/02/2003, 11h30

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