我尝试使用两列随机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
来完成我所需要的,但这已经让我的好奇心达到了顶峰。
有没有办法快速完成?
我很快就知道它是一个相对术语,我的意思是大约执行上述操作需要多快。
答案 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
)
没有在每一行上随机输入?