我的一位同事发现了我不知道的SQL Server中的一种行为。
CREATE VIEW dbo.vRandNumber AS
SELECT RAND() as RandNumber
GO
CREATE FUNCTION dbo.RandNumber() RETURNS float AS
RETURN (SELECT RandNumber FROM vRandNumber)
GO
DECLARE @mytable TABLE (id INT)
INSERT INTO @mytable SELECT 1
INSERT INTO @mytable SELECT 2
INSERT INTO @mytable SELECT 3
SELECT *, dbo.RandNumber() FROM @mytable这似乎是为数据集中的每个记录生成“随机”值的最快方法。但我不完全确定这是记录在案的行为的结果,还是利用了奇怪的巧合。
你会用这样的东西吗?
编辑
这不是关于RAND()函数本身的优点的问题,而是使用UDF/VIEW组合来强制它在每一行上重新计算。(在最终查询中只使用RAND(),而不是dbo.RandNumber(),将为每个记录提供相同的值。)
另外,问题是每次你看它的时候,它的价值都是不同的。例如,允许随机选择记录。
编辑
对于Server 2000+。
发布于 2009-09-16 16:57:18
我不会这样做的软件,我想继续工作的未来版本的Server。我找到了一种方法,可以为select语句中的每一行返回RAND()的不同值。这一发现是一次黑客攻击,2)是在Server 2005上完成的。它不再适用于Server 2008。这种经历使我更加依赖于骗术来获得rand()来返回每行的随机值。
此外,我相信SQL Server可以优化对UDF的多个调用.虽然这可能正在改变,因为它们现在确实允许一些不确定的函数。
仅对于Server 2005,一种强制rand()在select语句中执行每行的方法。不适用于Server 2008。在2005年之前的任何版本上都没有测试:
create table #t (i int)
insert into #t values (1)
insert into #t values (2)
insert into #t values (3)
select i, case when i = 1 then rand() else rand() end as r
from #t
1 0.84923391682467
2 0.0482397143838935
3 0.939738172108974而且,我知道您说您不是在询问rand()的随机性,但是我会给出一个很好的参考:http://msdn.microsoft.com/en-us/library/aa175776(SQL.80).aspx。它将rand()与newid()和rand(FunctionOf(PK,当前日期时间))进行比较。
发布于 2009-09-16 16:12:34
这取决于你需要什么随机值。它还取决于您需要INTEGER、VARCHAR等中的值的格式。
如果我需要对行进行随机排序,我会执行以下操作
SELECT *
FROM [MyTable]
ORDER BY newID()同样,您可以使用Server的标识“特性”生成一个ints表,并执行类似的查询,这可能会给出一个随机数。
我的同事每行需要一个随机整数,因此他向我们的表中添加了一个计算字段,这将生成一个在查询中返回的每个行的随机数(整数)。我不确定我是否推荐这样做;它在某些工具中引起了问题,但它为每个表提供了随机整数。然后,我们可以将我的newid()解决方案和那个表结合起来,在需要时得到一组随机数。
所以我回到,它取决于。,你能详细说明你需要什么吗?
Update:下面是表定义片段,我的同事曾经有一个计算过的列,每次查询该表时,每个行返回不同的随机数:
CREATE TABLE [dbo].[Table](
-- ...
[OrderID] [smallint] NOT NULL, --Not sure what happens if this is null
-- ...
[RandomizeID] AS (convert(int,(1000 * rand(([OrderID] * 100 * datepart(millisecond,getdate())))))),
-- ...
)发布于 2009-09-16 16:09:48
如果我必须为SQL中的每一行选择一个随机数,那么您可以向我证明RAND()正在生成真正的随机数.
是。我可能会用到类似的东西。
https://stackoverflow.com/questions/1433915
复制相似问题