Вы можете сделать это с таблицей чисел (master..spt_values) и stuff
в цикле.
declare @Word varchar(10) = 'sql'
declare @T table
(
Word varchar(10)
)
insert into @T values (@Word)
while not exists(select *
from @T
where Word = replicate('-', len(@Word)))
begin
insert into @T(Word)
select distinct stuff(T.Word, N.number, 1, '-')
from @T as T
cross join
master..spt_values as N
where N.type = 'P' and
N.number between 1 and len(@Word) and
stuff(T.Word, N.number, 1, '-') not in (select Word from @T)
end
select *
from @T
https://data.stackexchange.com/stackoverflow/q/122334/
ИлиВы можете использовать рекурсивный CTE
declare @Word varchar(10) = 'sql'
;with C as
(
select @Word as Word,
0 as Iteration
union all
select cast(stuff(Word, N.number, 1, '-') as varchar(10)),
Iteration + 1
from C
cross join
master..spt_values as N
where N.type = 'P' and
N.number between 1 and len(@Word) and
Iteration < len(@Word)
)
select distinct Word
from C
https://data.stackexchange.com/stackoverflow/q/122337/
Обновление
Рекурсивная версия CTE действительно медленная, как указано OP вкомментарий.Используя слово из 7 букв, из CTE возвращается 960800 строк.