Bonjour tout le monde,
je viens vers vous pour un souci concernant les sequences de SQL Server.
Nous générons une sorte de numéro de 10 chiffres composé comme suit :
- Sequence + 1 caractère
Ce numéro est généré sur validation d'une commande sur un site de commerce.
La séquence est la suivante :
La séquence démarre à 5 millions car nous étions à 4,3 millions avant une bascule vers une V2 de notre application avec nouvelle structure de base etc. Par sécurité nous avons faire redémarrer la séquence à 5millions pour éviter des doublons.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE SEQUENCE [cip].mySequence AS [int] START WITH 5000000 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647 NO CACHE GO
En gros la validation de commande fait dans une transaction l'action suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DECLARE @range_first_value_output sql_variant, @range_size_needed INT BEGIN TRANSACTION select @range_size_needed = count(*) from @TempData exec sys.sp_sequence_get_range @sequence_name='cip.sIdentifiantCarte', @range_size=@range_size_needed, @range_first_value = @range_first_value_output OUTPUT update @TempData set MYSEQ= rownumber+cast(@range_first_value_output as bigint) as varchar(9)) COMMIT TRANSACTION
@TempData est une variable de type TABLE avec comme colonne (ID PK, MYSEQ,ROWNUMBER)
Elle est préremplie juste avant avec ID, NULL , row_number() over ( order by ID) -1
(je fais -1 pour avoir des row number commençant à 0,1,2,3,4 etc)
Pour info
au départ j'ai utilisé NEXT VALUE FOR, après recherche sur internet, j'ai essayé justement cette méthode sp_sequence_get_range Mais exactement le même souci.
Donc on s 'attend à avoir comme séquence générée :
5000001
5000002
5000003
5000004
etc
Mais au final nous avons des incréments de dingue
La Colonne 1 est la séquence, la colonne 2 le numéro de commande chaque séquence étant un produit de la commande.
Donc il faut bien regarder les écart entre chaque commande, car à l'intérieur d'une meme commande tout est ok.
263602613 220627932
263602612 220627932
263602611 220627932
263602610 220627932
263602609 220627932
263602608 220627932
263592564 220627951
263586579 220627953
263583894 220627899
263578448 220627933
263573508 220627942
Comme vous pouvez le voir on a démarré à 5.000.000 en mi-septembre
on est le 22 novembre et la séquence est déjà à 263.573.508
On fait 1500 commandes par jour, peut être 3.000 ....
On a des fois des incrément de 28.000.
Merci pour votre aide <3
EDIT : 2 commandes qui posaient problèmes généraient des sequences à l'infini. Vu via un profiler sur la procédure stockée.
On a pu constater le pattern de 2 commandes qui revenaient en boucle.
Partager