Usted puede hacer esto con una tabla de números (master..spt_values) y stuff
en un bucle.
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
http://data.stackexchange.com/stackoverflow/q/122334/
O puede utilizar una reqursive 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
http://data.stackexchange.com/stackoverflow/q/122337/
actualización
La versión recursiva CTE es muy lento como PDI nombrado por OP en un comentario. Usando una palabra con 7 letras hay 960800 filas devueltas desde el CTE.
1 y tienes la salida en el orden que el PO quiere –
@ConradFrix - La orden no fue intencional :). –
segunda respuesta es buena, pero el tiempo para la cadena de entrada "ejemplo" es 28 segundos, la primera respuesta es muy buena y el tiempo para la cadena de entrada "ejemplo" es 0 segundos – jozi