Salut,
As tu vraiment besoin de combler les trous ?
Si oui, essaie de faire quelquechose autour de cette requête là, basée sur une CTE et ROW_NUMBER (exemple basé sur la table [Person].[Address] de la base AdventureWorks) :
WITH IDsAndRowNumbers AS
(
SELECT [AddressID] AS ID,
ROW_NUMBER() OVER (ORDER BY [AddressID] ASC) AS RowNumber
FROM [Person].[Address]
)
SELECT TOP 1 [ID], [RowNumber]
FROM IDsAndRowNumbers
WHERE [RowNumber]<>[ID]
Cette requête permet de sortir l'ID de la première entrée où le numéro séquentiel généré par ROW_NUMBER est différent du numéro séquentiel de la clé, ce qui indique un gap.
Prévoir ce qu'il faut en sortie pour les cas où aucun gap n'est trouvé, etc etc
Ca devrait mieux tourner qu'un curseur mais je pense qu'en cas d'opérations d'insert intensives tu devras basculer sur une autre stratégie.
/*
coq
MVP Visual C#
CoqBlog*/