Si può fare questo con un tavolo numeri (master..spt_values) e stuff
in un ciclo.
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/
Oppure si può utilizzare un 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/
Aggiornamento
La versione ricorsiva CTE è molto lento come POI inserito da OP in un commento. Usando una parola con 7 lettere ci sono 960800 righe restituite dal CTE.
fonte
2011-12-21 06:51:09
+1 e hai ottenuto l'output in modo che il PO vuole –
@ConradFrix - L'ordine non era :) intenzionale. –
seconda risposta è buona, ma il tempo per la stringa di input "esempio" è 28 secondi, la prima risposta è molto buona e il tempo per la stringa di input "example" è 0 secondi – jozi