这是每个记录生成随机数的好还是坏呢?(Is this a good or bad way of ge

2019-10-30 01:18发布

我的一位同事发现在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

似乎是生成在数据集中的每条记录一个“随机”值的最快方式。 但我不能完全确定,如果是记录的行为,或采取巧合的离奇convergance优势的结果。

会使用这样的事情?


编辑

这不是一个关于RAND()函数本身的优劣问题,而是使用UDF / VIEW的组合,以迫使它重新计算每一行。 (只需使用RAND()在最终的查询,而不是dbo.RandNumber(),都会对每条记录的值相同。)

此外,该点是价值的每一个你看着它的时间是不同的。 因此,使记录随机选择,例如。

编辑

对于SQL Server 2000+。

Answer 1:

我不会为一个软件,我想继续在SQL Server的未来版本的工作做到这一点。 我找到了一种方法来在SELECT语句中的每一行返回从RAND()不同的值。 这一发现是1)一个黑客位和2)的SQL服务器上进行2005年它不再有效的SQL Server 2008中的经验上让我靠弄虚作假获得兰特()返回每一个随机值的额外利瑞行。

另外,我认为SQL服务器允许的多次调用优化掉的UDF ......尽管这可能会改变,因为它们让现在的一些非确定性的功能。

对于SQL Server 2005只,一个办法强迫兰特()在SELECT语句中每行执行。 SQL 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

另外,我知道你说你不是问兰特()的随机性,但我会很好的参考是: http://msdn.microsoft.com/en-us/library/aa175776(SQL.80).aspx 。 它比较兰特()来NEWID()和RAND(FunctionOf(PK,当前日期时间))。



Answer 2:

这取决于你所需要的随机值。 这也取决于你需要的值的格式INTEGERVARCHAR等。

如果我需要行随机排序,我像做

SELECT *
FROM [MyTable]
ORDER BY newID()

同样,你可以生成的表ints使用SQL Server身份“功能”,并执行类似的查询,并且可以给你一个随机数。

我的同事需要每行的随机整数,所以他加入了计算领域我们的餐桌,并产生在每一个查询返回行的一个随机数(整数)。 我不知道,我建议这一点; 这引起了某些工具的问题,但它给了每个表的随机整数。 然后我们就可以结合自己的解决方案newid()和表并在需要时得到一组随机数。

所以,我回到它依赖。 你能否详细说明你需要什么呢?

更新 :这里是表定义片断我的同事曾经有一个计算列每行返回每个查询表时不同的随机数,:

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())))))),
    -- ...
)


Answer 3:

如果我不得不选择在SQL每行一个随机数,你能向我证明RAND()是产生真正的随机数...

是。 我可能会使用类似的东西。



Answer 4:

我不会用这一点。 据我所知,RAND()使用系统时间作为种子,并且当在彼此之后执行超过一次更迅速产生相同的值。 例如,试试这个:

SELECT    *, 
          RAND()
FROM      SomeTable

RAND()会给你的每一行相同的值。



Answer 5:

视图和UDF方法是笨拙的我:多余的琐碎对象使用一个有缺陷的功能。

我会使用CHECKSUM(NEWID())来生成随机数(而不是RAND() * xxx ),或新的SQL Server 2008 CRYPT_GEN_RANDOM



文章来源: Is this a good or bad way of generating random numbers for each record?