Я назвал свою таблицу пустым и использовал следующее:
declare @StartOffset int = 2
; With Missing as (
select @StartOffset as N where not exists(select * from Blank where ID = @StartOffset)
), Sequence as (
select @StartOffset as N from Blank where ID = @StartOffset
union all
select b.ID from Blank b inner join Sequence s on b.ID = s.N + 1
)
select COALESCE((select N from Missing),(select MAX(N)+1 from Sequence))
У вас в основном есть два случая - либо отсутствует ваше начальное значение (поэтому Missing CTE будет содержать одну строку), либо оно присутствует,таким образом, вы рассчитываете вперед, используя рекурсивный CTE (последовательность), берете из этого максимум и добавляете 1
Edit из комментария.Да, создайте еще один CTE в верхней части, который соответствует критериям вашего фильтра, а затем используйте его в остальной части запроса:
declare @StartOffset int = 2
; With BlankFilters as (
select ID from Blank where hasEntered <> 1
), Missing as (
select @StartOffset as N where not exists(select * from BlankFilters where ID = @StartOffset)
), Sequence as (
select @StartOffset as N from BlankFilters where ID = @StartOffset
union all
select b.ID from BlankFilters b inner join Sequence s on b.ID = s.N + 1
)
select COALESCE((select N from Missing),(select MAX(N)+1 from Sequence))
теперь это может вернуть строку, которая существует в таблице, но hasEntered = 1
Таблицы:
create table Blank (
ID int not null,
Name varchar(20) not null
)
insert into Blank(ID,Name)
select 2 ,'Fred' union all
select 3 ,'Fred' union all
select 4 ,'Fred' union all
select 6 ,'Fred' union all
select 7 ,'Fred' union all
select 8 ,'Fred' union all
select 11 ,'Fred'
go