Hello,

Au hasard du net, je suis tombé sur un code qui m'a l'air plutôt élégant pour s'assurer d'avoir une suite continue de numéro sans devoir s'emmerder à gérer les trous et sans devoir passer le niveau d'isolation des transactions sur serializable.

Voici le code :

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
while 1=1
    begin        
    declare @new_nr int
    select  @new_nr = max(InvoiceNr) + 1
    from    dbo.Invoices
 
    if @new_nr is null
        set @new_nr = 1
 
    insert  dbo.Invoices
            (InvoiceNr, ...)
    values  (@new_nr, ...)
 
    if @@rowcount = 1
        break
    end
Où Invoices serait une table dans ce goût-là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
CREATE TABLE [Imports].[Invoices_Numbers]
  (
     [InvoiceNumber] [INT] IDENTITY(1, 1) NOT NULL
     ,[Deleted]      [BIT] NOT NULL
     ,[Used]         [BIT] NOT NULL,
     CONSTRAINT [PK_Invoices_Numbers] PRIMARY KEY CLUSTERED ( [InvoiceNumber] ASC ) 
  )
ON [PRIMARY]
Qu'en pensez-vous ?