【问题标题】:How to write stored procedure in SQL Server 2008 that generates 3 million random no如何在 SQL Server 2008 中编写生成 300 万个随机数的存储过程
【发布时间】:2010-06-13 08:38:15
【问题描述】:

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

【问题讨论】:

    标签: sql tsql sql-server-2008 stored-procedures


    【解决方案1】:
    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:真的吗? - 我有300万。我会添加一个更好的衡量标准!
    【解决方案2】:

    您可以使用 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,因为rnd 函数将为CTE 的每个递归应用程序返回相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多