You can do this with a table of numbers (master..spt_values) and stuff
in a loop.
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/
Or you can use recursive 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/
Refresh
The recursive version of CTE is very slow, as the OP points out in a comment. Using a 7-letter word, 960,800 lines are returned from the CTE.
Mikael eriksson
source share