invm,
Хороший алгоритм, возьму к себе в копилку знаний.
А у меня получилось нечто монструозное

declare @t table (n int)
insert into @t values (1), (3), (4), (7), (8), (12)
;with cte as
(
select min(n) [mn], max(n) [mx] from @t
union all
select [mn] + 1, [mx] from cte
where mn < mx
)
select min(mn), max(mn) from
(
select mn, mn - row_number() over (order by (select 0)) [gr]
from cte
where not exists (select 1 from @t t where t.n = cte.mn)
) tmp
group by gr