J'ai plusieurs tables de contenu que je veux remplir avec des paragraphes aléatoires de texte. Dans MS Word, je peux simplement mettre = rand () et Presto! Je reçois trois paragraphes de texte frais-off-the-presse. P>
Y a-t-il un script / commande SQL que je peux utiliser pour générer des mots de dictionnaire aléatoires à l'aide de T-SQL? P>
3 Réponses :
Il n'y a rien de construit, mais il est facile de faire:
;
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)
J'aime ça. Comment puis-je pivoter pour, disons, 20 mots par ligne au lieu d'un mot par ligne?
@Raj Plus, désolé était absent, veuillez trouver la version 'Phrase' en bas.
Voici une autre version qui donne une phrase au lieu d'un seul mot par ligne, à la demande de RAJ plus.
;
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)
C'est une astuce soignée. Y a-t-il une liste d'autres = Func () S disponible en mot?
Voici quelques informations supplémentaires sur Rand () / Lorem () pour le curieux (comme je l'étais) support.microsoft. com / kb / 212251