2010-06-13 2 views

답변

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을 사용하는 rnd 기능은 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 

UPDATE [당신은 카이 제곱 테스트를 사용하여 이러한 숫자의 실제 분포를 확인 할 수 있습니다]. 나는 당신의 상황을 위해 시험을 조언 할 것이다.

+0

이것은 내 CTE보다 훨씬 빠릅니다. 그러나 sys.objects에 대한 세 가지 조인은 내 시스템에서 421k 행에 도달하지만 필요에 따라 더 많이 참여할 수 있습니다. – Andomar

+0

@Andomar : 정말? - 내게 3 백만 달러가있어. 나는 좋은 척도를 위해 또 다른 것을 추가 할 것이다! –

관련 문제