Tanken är att titta på var klyftorna börjar. Låt mig anta att du använder SQL Server 2012, och så har du lag() och lead() funktioner. Följande får nästa id :
select t.*, lead(id) over (order by id) as nextid
from t;
Om det finns ett gap, då nextid <> id+1 . Du kan nu karakterisera luckorna med 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;
EDIT:
Utan lead() , jag skulle göra samma sak med en korrelerad underfråga:
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;
Förutsatt id är en primärnyckel på bordet (eller till och med att den bara har ett index), bör båda metoderna ha rimlig prestanda.