L'idée est de regarder où commencent les lacunes. Laissez-moi supposer que vous utilisez SQL Server 2012, et que vous avez donc le lag() et lead() les fonctions. Ce qui suit obtient le prochain id :
select t.*, lead(id) over (order by id) as nextid
from t;
S'il y a un espace, alors nextid <> id+1 . Vous pouvez maintenant caractériser les écarts en utilisant where :
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*, lead(id) over (order by id) as nextid
from t
) t
where nextid <> id+1;
MODIFIER :
Sans le lead() , je ferais la même chose avec une sous-requête corrélée :
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*,
(select top 1 id
from t t2
where t2.id > t.id
order by t2.id
) as nextid
from t
) t
where nextid <> id+1;
En supposant que l'id est une clé primaire sur la table (ou même qu'elle a juste un index), les deux méthodes devraient avoir des performances raisonnables.