我正在对SQL sproc进行一些性能测试,只想敲打一个快速数据生成器进行测试。
我正在使用一种简单的方法来生成伪随机(在这种情况下不需要真随机)varchar字段。
我到目前为止的想法是使用可以使用的有效字符的字符定义,然后根据此定义构建字符串,并使用伪随机长度进行长度变化,并定义最大/最小长度。
修改
我的测试数据生成器:
DECLARE @MyDataTable TABLE
(
RecID int IDENTITY(1,1) PRIMARY KEY,
SomeText varchar(255)
)
DECLARE @RecId int, @SomeText varchar(255),
@maxlength int, @minlength int,
@RecordCount int, @Counter int
SET @maxlength = 254
SET @minlength = 50
SET @RecordCount = 500000
SET @Counter = 1
WHILE (@Counter < @RecordCount)
BEGIN
INSERT INTO @MyDataTable
(
SomeText
)
SELECT TOP 1
(
select top (abs(checksum(newid())) % (@maxlength-@minlength) + @minlength) char(abs(checksum(newid())) % 26 + ascii('A'))
from sys.all_objects a1
where sign(a1.object_id) = sign(t.object_id) /* Meaningless thing to force correlation */
for xml path('')
) as NewRandomString
FROM sys.all_objects t;
SET @Counter = @Counter + 1
END
答案 0 :(得分:11)
我最近写了一篇博文。
http://msmvps.com/blogs/robfarley/archive/2009/12/07/randomising-data.aspx
select top (@stringlength) char(abs(checksum(newid())) % 26 + ascii('A'))
from sys.all_objects
for xml path('')
;
编辑:抱歉 - 没有包含随机长度的东西......
SELECT
(
select top (abs(checksum(newid())) % (@maxlength-@minlength) + @minlength) char(abs(checksum(newid())) % 26 + ascii('A'))
from sys.all_objects
for xml path('')
) as NewRandomString
FROM yourTable; /* Maybe something like dbo.nums? */
编辑:对不起 - 需要关联...
SELECT
(
select top (abs(checksum(newid())) % (@maxlength-@minlength) + @minlength) char(abs(checksum(newid())) % 26 + ascii('A'))
from sys.all_objects a1
where sign(a1.object_id) = sign(t.object_id) /* Meaningless thing to force correlation */
for xml path('')
) as NewRandomString
,*
FROM sys.all_objects t;
答案 1 :(得分:4)
SELECT
--fixed length
CAST(CRYPT_GEN_RANDOM(50) AS varchar(100)),
--variable length
CAST(CRYPT_GEN_RANDOM(ABS(CHECKSUM(NEWID()))%50) AS varchar(100))
样品:
r¡Ñ”ã8Ò¯wß×1W=ýÎÜTÜN:Læ*é=Öô/qAtmտ׌1):¢ìèð’¾N
mÁBòºÇòWãmßyWßðÛ2ﬔœ¹t ¦2›ÏÀë?î7Ä›››ºªb
我的邪恶双胞胎希望将其用作密码生成器......
答案 2 :(得分:2)
这将生成一个可变长度的随机字符串。
DECLARE @text nvarchar(255),
@length int,
@i int;
SET @i = 0
SET @text = ''
SET @length = RAND() * 50 + 215
WHILE (@i < @length)
BEGIN
SET @text = @text + CHAR(RAND() * 26 + 65)
SET @i = @i + 1
END
答案 3 :(得分:1)