2013-07-01 88 views
1

我正在使用CTE(而不是循環)使用以下查詢生成隨機數。奇怪的是,查詢不會在索引值2後生成隨機數。您可以查看demo here。對CTE的這種行爲有任何解釋嗎?使用CTE的SQL Server隨機數

;with LoopCounter 
    as(
     select 1 Indexer, RAND() RandNumber 
     union all 
     select Indexer + 1, RAND() RandNumber 
     from LoopCounter 
     where 
      Indexer <= 1000 
    ) 
    select * 
    from LoopCounter 
    OPTION(MAXRECURSION 0) 
+0

您可以添加索引作爲種子RAND():...'選擇索引+ 1,RAND(索引+ 1)RandNumber' ... –

+7

'RAND(校驗(NEWID( )))'會提供更好的分配。至於'爲什麼'參見[RAND是一個運行時常量](http://www.sqlskills.com/blogs/conor/wrapping-my-head-around-rand-sql-server/) –

+3

有多種優化這會阻止RAND()被多次評估(或者在你的情況下,一次爲錨,一次爲遞歸部分)。這是一個想法來阻止:http://sqlfiddle.com/#!6/72319/4(這也包括保羅的建議,它不依賴左窗格中的任何架構)。 –

回答

4
;with LoopCounter 
    as(
     select 1 Indexer, ABS(Cast(Cast(CRYPT_GEN_RANDOM(4) as INT) as Float))/Cast(0x7FFFFFFF as int) RandNumber 
     union all 
     select Indexer + 1, ABS(Cast(Cast(CRYPT_GEN_RANDOM(4) as INT) as Float))/Cast(0x7FFFFFFF as int) RandNumber 
     from LoopCounter 
     where 
      Indexer <= 1000 
    ) 
    select * 
    from LoopCounter 
    OPTION(MAXRECURSION 0)