T-SQL, эквивалентный из =rand ()

Это полезно, если Вы хотите ничего не сделать, если это действительно существует, но создает его, если это не существует.

def get_var
  @var ||= SomeClass.new()
end

Это только создает новый экземпляр однажды. После этого это просто продолжает возвращать var.

7
задан Raj More 14 July 2009 в 17:25
поделиться

3 ответа


;
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)     
7
ответ дан 6 December 2019 в 21:18
поделиться

Нет ничего встроенного, но это легко сделать:

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
2
ответ дан 6 December 2019 в 21:18
поделиться

Вот еще одна версия, которая дает предложение вместо одного слова в строке, как попросил Радж Мор.


;
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)         
3
ответ дан 6 December 2019 в 21:18
поделиться