2013-09-24 45 views
0

我試圖用兩列隨機FLOAT s填充一個表,但生成的每一行都是相同的。使用RAND創建測試數據進行計算()

;WITH CTE (x, y) AS (
    SELECT RAND(), RAND() 
    UNION ALL 
    SELECT x, y FROM CTE 
) 

--INSERT INTO CalculationTestData (x, y) 
SELECT TOP 5000000 x, y 
FROM CTE 
OPTION (MAXRECURSION 0) 

我能做到什麼,我只需要通過只是不使用CTE罰款,但是這已經達到頂峯了我的好奇心。

有沒有辦法快速做到這一點?

我很快就知道這是一個相對術語,我的意思是大約需要多快來執行上述操作。

+0

它是否需要是一個浮動? – orgtigger

+0

@orgtigger,最好是 – Khan

回答

2

你有什麼期望比CTE的重複中行的其它因爲你遞歸只是再次選擇他們

SELECT RAND(), RAND()  -- SELECT 9 , 10 
UNION ALL 
SELECT x, y     -- SELECT 9 , 10 

你想做的事更是這樣

SELECT RAND(), RAND()  
UNION ALL 
SELECT RAND(), RAND()  -- but the problem is that this 'row' will be duplicated 

所以你需要種子和種子每行給你像

SELECT RAND(CAST(NEWID() AS VARBINARY)), 
     RAND(CAST(NEWID() AS VARBINARY)) 
UNION ALL 
SELECT RAND(CAST(NEWID() AS VARBINARY)), 
     RAND(CAST(NEWID() AS VARBINARY)) 

使用NEWID()作爲種子是一種方式有可能是其他人更有效率等

+0

你差點讓我拍我自己!但是,第二行與此相同: -/ – Khan

+0

您的最後一個示例確實有效,非常酷。 – Khan

1

試試這個而不是rand():它會給每個條目一個隨機的正整數。我曾與蘭特同樣的問題()最近

ABS(Checksum(NewID())) 

浮子:

cast(ABS(Checksum(NewID())) as float) 

是明確的:

;WITH CTE (x, y) AS (
    SELECT cast(ABS(Checksum(NewID())) as float), cast(ABS(Checksum(NewID())) as float) 
    UNION ALL 
    SELECT x, y FROM CTE 
) 

沒有給每行一個隨機進入?

+0

我試過從另一個SO我發現,所有的行仍然是相同的。 – Khan

+0

有趣的是,我們遇到了使用select語句在表中插入行的問題。 NewID()函數是唯一可以爲每個插入的行賦予一個隨機條目的函數。 – orgtigger

+0

感謝您指出了這一點,這只是產生'INT'作爲浮游物鑄造。但它比我所在的地方要近得多。感謝您的努力。 +1 – Khan