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
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 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
NB: La colonne LibelleTypeBranchement est UNIQUE dans ma BD
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
Table Branchement
Insertion 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
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
Après exécution de ces insertions dans la table [dbo].[TypeBranchement], J'aurai 03 sequences qui seront crées
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')
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]
Voila, SQL Server me permet pas 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 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
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?
Partager