Порядок значений в вашем списке неявно является частью проблемы. Этот порядок должен храниться как часть данных в исходной таблице, иначе проблема не может быть надежно решена, даже в цикле. Я добавил «порядковый» столбец для представления отсутствующего порядка.
declare @orderedset table(ordinal int not null, value int null)
insert into @orderedset(ordinal, value) values (1, 100)
insert into @orderedset(ordinal, value) values (2, 10)
insert into @orderedset(ordinal, value) values (3, NULL)
insert into @orderedset(ordinal, value) values (4, NULL)
insert into @orderedset(ordinal, value) values (5, 22)
insert into @orderedset(ordinal, value) values (5, NULL);
WITH fillvalues AS
(
SELECT ordinal, value FROM @orderedset
WHERE value IS NOT NULL
)
SELECT
(
SELECT value FROM fillvalues
WHERE fillvalues.ordinal =
(
SELECT MAX(ordinal)
FROM fillvalues
WHERE ordinal <= unfilled.ordinal
)
) As filledvalue
FROM @orderedset unfilled