使用RAND()创建测试数据以进行计算

时间:2013-09-24 18:57:08

标签: sql-server recursion random

我尝试使用两列随机FLOAT填充表格,但生成的每一行都相同。

;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来完成我所需要的,但这已经让我的好奇心达到了顶峰。

有没有办法快速完成?

我很快就知道它是一个相对术语,我的意思是大约执行上述操作需要多快。

2 个答案:

答案 0 :(得分: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()作为种子是一种可能更有效的其他方式等等

答案 1 :(得分:1)

尝试使用而不是rand():它会在每个条目上给出一个随机的正整数。我最近和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 
)

没有在每一行上随机输入?