0

我试图用两列 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,但这已经达到了我的好奇心。

有没有办法快速做到这一点?

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

4

2 回答 2

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(),可能还有其他更有效的方法等

于 2013-09-24T19:10:01.080 回答
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 
)

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

于 2013-09-24T19:07:21.427 回答