【问题标题】:TSQL Pseudo Random text generatorSQL 伪随机文本生成器
【发布时间】:2011-01-10 06:24:08
【问题描述】:

我正在对一个 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

【问题讨论】:

    标签: sql tsql random


    【解决方案1】:

    我最近写了一篇关于这个的博客文章。

    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;
    

    【讨论】:

    • 抱歉编辑...我想我也会把历史留给你。您可能需要添加一个以允许 @maxlength 长的字符串:(@maxlength-@minlength+1)
    • 谢谢 Rob,我认为这是一个非常优雅的解决方案。
    【解决方案2】:

    对于SQL Server 2008

    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
    

    我的邪恶双胞胎想用它作为密码生成器......

    【讨论】:

    • 一击,你猜对了我的密码!
    【解决方案3】:

    这将生成一个可变长度的随机字符串。

    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
    

    【讨论】:

      【解决方案4】:

      如果您需要快速或不想自己动手, 您也可以使用来自

      的工具

      http://www.generatedata.com/

      但如果您只是使用在线演示,则只能生成 100 行。

      【讨论】:

        猜你喜欢
        • 2014-05-18
        • 2015-08-07
        • 2012-02-12
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多