如何在SQL Server 2008中编写生成300万个随机数的存储过程

3

如何在SQL Server 2008中编写存储过程,以整数数据类型生成两列300万个随机数。

2个回答

5
SELECT TOP 3000000 
    ABS(CHECKSUM(NewId())) As RndCol1, 
    ABS(CHECKSUM(NewId())) AS RndCol2
FROM 
    sys.objects s1 
    CROSS JOIN sys.objects s2 
    CROSS JOIN sys.objects s3
    CROSS JOIN sys.objects s4

[您可能需要使用卡方检验来检查这些数字的实际分布情况]

更新: 这些数字的随机性可能不符合卡方分布检验。建议根据您的情况进行测试。


这比我的CTE快得多。但是在我的系统上,对sys.objects进行三重连接会得到421k行,但我想您可以根据需要连接更多! - Andomar
@Andomar:真的吗?- 我的上面有300万。我再加一个以确保准确! - Mitch Wheat

1
您可以使用CTE,例如:
create procedure dbo.GiveMeRandomNumbers
as
    begin
    with qry as (
        select  CAST(CAST(NEWID() AS VARBINARY) AS INT) as col1
        ,       CAST(CAST(NEWID() AS VARBINARY) AS INT) as col2
        ,       0 as i
        union all
        select  CAST(CAST(NEWID() AS VARBINARY) AS INT) as col1
        ,       CAST(CAST(NEWID() AS VARBINARY) AS INT) as col2
        ,       i + 1 
        from    qry
        where   i < 3000000
    )
    select  col1, col2
    from    qry
    option  (maxrecursion 0)
    end

这里使用 newid 因为对于 CTE 的每个递归应用,rnd函数将返回相同的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接