Bạn có thể làm điều này với một số bảng (master..spt_values) và stuff
trong một vòng lặp.
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/
Hoặc bạn có thể sử dụng một 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/
Cập nhật
Phiên bản CTE đệ quy là rất chậm như poi nted ra bởi OP trong một bình luận. Sử dụng một từ có 7 chữ cái có 960800 hàng được trả lại từ CTE.
Nguồn
2011-12-21 06:51:09
1 Và bạn có đầu ra theo thứ tự mà OP muốn –
@ConradFrix - Trình tự là không cố ý :). –
câu trả lời thứ hai là tốt nhưng thời gian cho chuỗi đầu vào "ví dụ" là 28 giây, câu trả lời đầu tiên rất tốt và thời gian cho chuỗi "example" là 0 giây – jozi