2009-07-14 34 views
7

Tôi có một số bảng nội dung mà tôi muốn điền vào với các đoạn văn bản ngẫu nhiên. Trong MS Word, tôi có thể chỉ cần đặt = rand() và mau! Tôi nhận được ba đoạn văn bản mới mẻ.T-SQL tương đương = rand()

Có một tập lệnh/lệnh SQL mà tôi có thể sử dụng để tạo các từ điển ngẫu nhiên sử dụng t-sql không?

+0

Đó là một mẹo nhỏ gọn. Có một danh sách khác = func() s có sẵn trong từ không? –

+3

Dưới đây là một số thông tin thêm về rand()/lorem() cho tò mò (như tôi) http://support.microsoft.com/kb/212251 –

Trả lời

7

; 
declare 
    @Lorem nvarchar(max), 
    @RowsToGen int, 
    @Factor int 

select 
    @Lorem = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', 
    @RowsToGen = 200 

-- strip punctuations 
set @Lorem = replace(@Lorem, ',', '') 
set @Lorem = replace(@Lorem, '.', '') 

; 
with 
Num1(Pos) as 
(
    select cast(1 as int) 
    union all 
    select cast(Pos + 1 as int) from Num1 where Pos < len(@Lorem) 
), 
Words as 
(
    select substring(@Lorem, Pos, charindex(' ', @Lorem + ' ', Pos) - Pos) as Word 
     from Num1 where Pos <= len(@Lorem) and substring(',' + @Lorem, Pos, 1) = ' ' 
), 
WordsCnt(Factor) as 
(
    select @RowsToGen/count(*) + 1 from Words 
), 
Num2(Pos) as 
(
    select cast(1 as int) 
    union all 
    select cast(Pos + 1 as int) from Num2 cross join WordsCnt where Pos < WordsCnt. Factor 
) 
select top (@RowsToGen) 
    Word 
from 
    Num2 
cross join 
    Words 
order by newid() 
option (maxrecursion 0)  
+0

+1 để sử dụng "order by newid()" để phân ngẫu nhiên. –

+0

Tôi thích điều này. Làm thế nào để tôi xoay vòng, ví dụ, 20 từ trên mỗi dòng thay vì một từ trên mỗi dòng? –

+0

@Raj Thêm, xin lỗi đã đi, xin vui lòng tìm phiên bản 'câu' ở phía dưới. –

2

Không có gì được xây dựng trong, nhưng thật dễ dàng để làm:

create table DictionaryWords 
(
    Id int primary key identity (1,1), 
    Word nvarchar(100) not null 
) 
go 

insert DictionaryWords values ('the') 
insert DictionaryWords values ('quick') 
insert DictionaryWords values ('brown') 
insert DictionaryWords values ('fox') 
insert DictionaryWords values ('jumped') 
insert DictionaryWords values ('over') 
insert DictionaryWords values ('the') 
insert DictionaryWords values ('lazy') 
insert DictionaryWords values ('dog') 
go 

create procedure dbo.CreateRandomText(@numWords int, @text nvarchar(max) out) 
as 
begin 

    declare @rowcount int 
    select @rowcount = count(*) from DictionaryWords 

    select @text = '' 

    while @numWords <> 0 
     select @text = @text + ' ' + Word, @numWords = @numWords - 1 
     from DictionaryWords 
     where Id = cast(@rowcount * rand() as integer) 

end 
go 

declare @text nvarchar(max) 
exec CreateRandomText 10, @text out 
select @text 
3

Dưới đây là một phiên bản đó đưa ra một câu thay vì chỉ một từ duy nhất cho mỗi hàng, theo yêu cầu của Raj More.


; 
declare 
    @Lorem nvarchar(max), 
    @SentenceToGen int, 
    @WordsPerSentence int, 
    @Factor int 

select 
    @Lorem = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', 
    @SentenceToGen = 200, 
    @WordsPerSentence = 10 

-- strip punctuations 
set @Lorem = replace(@Lorem, ',', '') 
set @Lorem = replace(@Lorem, '.', '') 

; 
with 
Num1(Pos) as -- number of chars in @Lorem 
(
    select cast(1 as int) 
    union all 
    select cast(Pos + 1 as int) from Num1 where Pos < len(@Lorem) 
), 
Words as 
(
    select lower(substring(@Lorem, Pos, charindex(' ', @Lorem + ' ', Pos) - Pos)) as Word 
     from Num1 where Pos <= len(@Lorem) and substring(',' + @Lorem, Pos, 1) = ' ' 
), 
WordsCnt(Factor) as 
(
    select ceiling(cast(@SentenceToGen * @WordsPerSentence as float)/count(*)) from Words 
), 
Num2(Pos) as -- product of words required, to be divided by number of words found in @Lorem 
(
    select cast(1 as int) 
    union all 
    select cast(Pos + 1 as int) from Num2 cross join WordsCnt where Pos < WordsCnt.Factor 
), 
Sentences as 
(
    select 
     ntile(@SentenceToGen) over (order by newid()) as SentenceId, 
     Word 
    from 
     Num2 
    cross join 
     Words 
), 
Num3(Pos) as -- list of SentenceId 
(
    select distinct SentenceId from Sentences 
) 
select 
    (
     select top (@WordsPerSentence) 
      Word + ' ' 
     from 
      Sentences 
     where 
      Sentences.SentenceId = Num3.Pos 
     for xml path('') 
    ) 
    as Sentence 
from 
    Num3  
option (maxrecursion 0)