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:
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:
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:
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:
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:
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?