Как написать хранимую процедуру в SQL Server 2008, которая генерирует 3 миллиона случайных нет - PullRequest
3 голосов
/ 13 июня 2010

Как написать хранимую процедуру в SQL Server 2008, которая генерирует 3 миллиона случайных чисел в двух столбцах с целочисленным типом данных.

Ответы [ 2 ]

5 голосов
/ 13 июня 2010
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

[Вы можете проверить фактическое распределение этих чисел, используя критерий хи-квадрат]

ОБНОВЛЕНИЕ : их случайность может не соответствовать критерию распределения хи-квадрат. Я бы посоветовал тестирование в ваших обстоятельствах.

1 голос
/ 13 июня 2010

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...