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 :

Incrementer dynamiquement une sequence


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut Incrementer dynamiquement une sequence
    Bonjour,
    Je crée dynamiquement des séquences dans ma BD dans SQL Server 2012 et j'aimerai pouvoir appeler ma séquence dynamiquement pour récupérer le NEXT VALUE.

    Table TypeBranchement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE [dbo].[TypeBranchement](
    	[IdTypeBranchement] [int] IDENTITY(1,1) NOT NULL,
    	[LibelleTypeBranchement] [varchar](250) NOT NULL,
     CONSTRAINT [PK_TypeBranchement] PRIMARY KEY CLUSTERED 
    (
    	[IdTypeBranchement] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    Création dynamique d'un trigger créant dynamiquement des sequences après un Insert sur la table TypeBranchement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TRIGGER [dbo].[CreationSequence] 
       ON  [dbo].[TypeBranchement] 
       AFTER INSERT
    AS 
    BEGIN
     
    	SET NOCOUNT ON;
    	DECLARE  @TypeBranchement varchar(200), @VarSequence Varchar(200)
    	SET @TypeBranchement = (SELECT LibelleTypeBranchement FROM inserted I )
            SET @TypeBranchement = UPPER(REPLACE(@TypeBranchement,' ', ''))	
    	SET @VarSequence = 'CREATE SEQUENCE [dbo].[' + @TypeBranchement + ']  START WITH 0  INCREMENT BY 1  NO CACHE'
    	EXECUTE (@varSequence)
    END
    NB: La colonne LibelleTypeBranchement est UNIQUE dans ma BD

    Table Branchement
    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 [dbo].[Branchement](
    	[IdBranchement] [Int] IDENTITY(1,1) NOT NULL,
    	[NumeroBranchement] [varchar](20) NULL,
    	[NomAbonne] [varchar](100) NULL,
    	[IdTypeBranchement] [int] NOT NULL,
     CONSTRAINT [PK_Branchement] PRIMARY KEY CLUSTERED 
    (
    	[IdBranchement] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    ALTER TABLE [dbo].[Branchement]  WITH CHECK ADD  CONSTRAINT [FK_Branchement_TypeBranchement] FOREIGN KEY([IdTypeBranchement])
    REFERENCES [dbo].[TypeBranchement] ([IdTypeBranchement])
    GO
    ALTER TABLE [dbo].[Branchement] CHECK CONSTRAINT [FK_Branchement_TypeBranchement]
    GO
    Insertion sur la table TypeBranchement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO [dbo].[TypeBranchement]  (LibelleTypeBranchement) VALUES ('Test1')
    INSERT INTO [dbo].[TypeBranchement]  (LibelleTypeBranchement) VALUES ('Test2')
    INSERT INTO [dbo].[TypeBranchement]  (LibelleTypeBranchement) VALUES ('Test3')
    Après exécution de ces insertions dans la table [dbo].[TypeBranchement], J'aurai 03 sequences qui seront crées
    Nom Séquence 1:[dbo].[Test1]
    Nom Séquence 2:[dbo].[Test1]
    Nom Séquence 3:[dbo].[Test1]

    Et voila ce que je veux faire

    Lors d'une insertion dans [dbo].[Branchement], la valeur NumeroBranchement doit correspondre à la valeur d'une séquence en fonction de la clé se trouvant dans
    [dbo].[Branchement] ([IdTypeBranchement])

    Essai de trigger sur la table [dbo].[Branchement]
    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
    CREATE TRIGGER [cefore].[NumeroBranchement] 
       ON  [dbo].[Branchement]
          AFTER INSERT
    AS 
    BEGIN
    	SET NOCOUNT ON;
    	DECLARE  @Racine varchar(20), @Sequence bigint, @NomSequence Varchar(200), @NumBranchement Varchar(100), @LibelleTypeNumBranchement varchar(200)
    	SET @Racine= N'PPI' 
    	SET @LibelleTypeBranchement = (SELECT LibelleTypeBranchement FROM [dbo].[TypeBranchement] WHERE [IdTypeBranchement] = (Select IdTypeBranchement From inserted))
    	SET @LibelleTypeBranchement = UPPER(REPLACE(@LibelleTypeBranchement,' ', ''))
    	 
    	SET @NomSequence = @LibelleTypeBranchement
    	SET @NomSequence = '[dbo].[' + @NomSequence + ']'
    
    	SET @NomSequence = 'NEXT VALUE FOR ' + @NomSequence		
    	SET @Sequence = (EXECUTE @NomSequence)
    	SET @Sequence = CAST(@Sequence AS varchar(100))
    	SET @NumBranchement = @Racine + RIGHT('0000000000' + @Sequence, 10)
     	UPDATE [dbo].[Branchement] SET [NumeroBranchement] = @NumBranchement WHERE [IdBranchement] = (SELECT IdBranchement From inserted)
    
    END
    Voila, SQL Server me permet pas de faire:
    SET @NomSequence = 'NEXT VALUE FOR ' + @NomSequence
    SET @Sequence = (EXECUTE @NomSequence)

    Comment procéder pour appéler dynamiquement une sequence en ne connaissant son nom que par des variables comme décrit ci-dessus?

  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 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Utilisez sp_executesql pour lier vos variables dynamiques et statiques.

    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 éclairé
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut
    Thanks SQLPro,
    Effectivement sp_executesql permet de lancer l'éxécution en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @NomSequence = 'NEXT VALUE FOR ' + @NomSequence		
    EXECUTE sp_executesql @NomSequence
    Mais je peux pas faire l'affectation de cette valeur comme voulu du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @Sequence = EXECUTE sp_executesql @NomSequence
    Ou est ce que je me prends mal?

  4. #4
    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 SOPSOU Voir le message
    Ou est ce que je me prends mal?
    Je pense que oui...

    1/ en premier lieu, votre trigger sur TypeBranchement ne fonctionnera pas si vous insérez plusieurs lignes en même temps.
    2/ ensuite, quel est l’intérêt de ces numéros ? A quoi doivent-ils servir et pourquoi ne pas simplement créer une unique séquence pour tous les types ?

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Par défaut
    Thanks,
    L'inquiétude 1 n'arrivera jamais. Et au finish, ma table TypeBranchement ne comportera pas plus 10 lignes. Le seul problème, c'est que son Libelle est inconnu actuellement.
    L'inquiétude 2: En fait pour chaque typeBranchement, je dois avoir avoir des numeros d'ordre chronologique car utilisé et attribué à un abonné.

    Exemple:
    Pour le TypeBranchement 1, j'aurai NumeroBranchement qui pendra les valeurs 1,2,3,4,5,6,7 et ainsi de suite sans interruption.
    Pour le TypeBranchement 2, j'aurai NumeroBranchement qui pendra les valeurs 1,2,3,4,5,6,7 et ainsi de suite sans interruption.
    Pour le TypeBranchement 3, j'aurai NumeroBranchement qui pendra les valeurs 1,2,3,4,5,6,7 et ainsi de suite sans interruption.
    ...

    Et cela est essentiel pour moi, j'ai pour cela je cree dynamiquement, des sequences pour chaque typeBranchement et lors de l'insertion dans ma table Branchement, je sais quelle sequence a utilisée suivant le IdTypeBranchement utilisé pour l'enregistrement dans la table Branchement.

  6. #6
    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
    Citation Envoyé par SOPSOU Voir le message
    L'inquiétude 2: En fait pour chaque typeBranchement, je dois avoir avoir des numeros d'ordre chronologique car utilisé et attribué à un abonné.
    Oui, mais utilisé pour quoi ??? en quoi cela sera-t-il genant si les numéros ne se suivent pas.

    Car :
    Citation Envoyé par SOPSOU Voir le message
    Pour le TypeBranchement 1, j'aurai NumeroBranchement qui pendra les valeurs 1,2,3,4,5,6,7 et ainsi de suite sans interruption.
    Que se passera-t-il si vous supprimez le 3 ? décalerez vous 4,5,6,7 ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/10/2006, 15h19
  2. ajouter un champ dynamiquement à une instance de table
    Par maniack dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 23h58
  3. tri avec l'ordre UPDATE et incrementation d'une colonne
    Par Staron dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/02/2004, 08h48
  4. peut-on savoir si un champ a une sequence??
    Par e11137 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/01/2004, 14h54
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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