Moins d'une minute à lire
Gérer plusieurs auto incréments
Comment gérer plusieurs auto-incréments sur une seule table, lorsqu’on doit sous-numéroter une colonne par rapport à une première colonne ?
Exemple classique, une table qui contient un numéro de document, par exemple de facture, par numéro d’agence :
CREATE TABLE dbo.facture (
NumeroAgence TINYINT NOT NULL,
NumeroFacture INT NOT NULL,
CONSTRAINT pk_facture PRIMARY KEY (NumeroFacture, NumeroAgence)
);
Exemple de procédure
CREATE PROCEDURE [dbo].[AjouteFacture]
@NumeroAgence tinyint
AS BEGIN
SET NOCOUNT ON
DECLARE @new_id int;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRY
BEGIN TRANSACTION;
SELECT @new_id = ISNULL(max(NumeroFacture),0) + 1
FROM facture
WHERE NumeroAgence = @NumeroAgence ;
INSERT INTO facture (NumeroAgence, NumeroFacture)
VALUES (@NumeroAgence, @new_id) ;
COMMIT TRAN
SELECT @new_id AS id
END TRY
BEGIN CATCH
ROLLBACK TRAN;
SELECT NULL AS id;
;THROW;
END CATCH
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
RETURN @new_id
END
GO
Exemple de déclencheur
CREATE TRIGGER atr_i_facture_autoincrement
ON dbo.facture
AFTER INSERT
AS BEGIN
IF @@ROWCOUNT = 0 RETURN;
UPDATE dbo.facture
SET NumeroFacture = (SELECT COALESCE(MAX(NumeroFacture),0) + 1 FROM facture)
FROM INSERTED i
JOIN dbo.facture f
WHERE i.NumeroFacture IS NULL
AND i.NumeroAgence = f.NumeroAgence;
END;