2010-06-13 7 views

Répondre

1

Vous pouvez utiliser un CTE, par exemple:

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 

Il utilise newid parce que la fonction rnd renverra le même résultat pour chaque application récursive du CTE.

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 

[Vous pouvez vérifier la distribution réelle de ces chiffres à l'aide d'un test de chi carré]

MISE À JOUR: Le caractère aléatoire de ceux-ci peuvent ne pas satisfaire au critère de la distribution chi-carré. Je conseillerais de tester dans vos circonstances.

+0

Ceci est beaucoup plus rapide que mon CTE. Mais une jointure triple sur sys.objects obtient 421k lignes sur mon système, mais je suppose que vous pouvez en rejoindre plus au besoin! – Andomar

+0

@Andomar: vraiment? - J'ai 3 millions sur le mien. J'en ajouterai un autre pour faire bonne mesure! –

Questions connexes