Sql server 2008 sql server 2008未生成随机值

Sql server 2008 sql server 2008未生成随机值,sql-server-2008,tsql,random,Sql Server 2008,Tsql,Random,在SQLServer2008中,为结果集中的每一行生成随机值时,我遇到了一个问题。我发现了一个类似的问题,但在执行建议的答案时,我看到了与以前相同的问题。在运行我在下面提供的查询时,似乎有时会在连续的行中显示相同的值,即使我正在为每一行调用一个新的NEWID DECLARE @Id int = 0 DECLARE @Counter int = 1 DECLARE @Value int CREATE TABLE #Table1 ( id int identity(1,1) ,Value int

在SQLServer2008中,为结果集中的每一行生成随机值时,我遇到了一个问题。我发现了一个类似的问题,但在执行建议的答案时,我看到了与以前相同的问题。在运行我在下面提供的查询时,似乎有时会在连续的行中显示相同的值,即使我正在为每一行调用一个新的NEWID

DECLARE @Id int = 0
DECLARE @Counter int = 1
DECLARE @Value int

CREATE TABLE #Table1
(
id int identity(1,1)
,Value int
)

WHILE @Counter < 100000
BEGIN
    INSERT INTO #Table1 (Value)
    SELECT CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT)
    SET @Counter += 1
END

SET @Counter = 0
WHILE @Counter < 5
BEGIN
    SELECT
        @Value = T.Value
        ,@Id = T.id
    FROM #Table1 T
    WHERE T.id = CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + 1 + @Counter

    IF @Id <> 0
        SELECT @Value AS Value ,@Id as ID
    SET @Counter += 1
END
DROP TABLE #Table1

如果我按照我提供的链接中的建议将INT更改为BIGINT,则不会解决任何问题,因此我不认为这是一个溢出问题。

如果我将计算从select中去掉,则不会得到加倍的行:

DECLARE @Id int = 0
DECLARE @Counter int = 1
DECLARE @Value int
-- new variable
DECLARE @DERIVED INT 

CREATE TABLE #Table1
(
id int identity(1,1)
,Value int
)

WHILE @Counter < 100000
BEGIN
    INSERT INTO #Table1 (Value)
    SELECT CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT)
    SET @Counter += 1
END

SET @Counter = 0
WHILE @Counter < 5
BEGIN
--set here to remove calculation from the select
    SET @DERIVED = CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + 1 + @Counter;
    SELECT
        @Value = T.Value
        ,@Id = T.id
    FROM #Table1 T
    WHERE T.id = @DERIVED

    IF @Id <> 0
        SELECT @Value AS Value ,@Id as ID;
    SET @Counter += 1
END
DROP TABLE #Table1
总体结果相同,伪随机结果不同。但是,如果我改变

CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + 1 + @Counter


我仍然不断地得到重复。这意味着优化器可能正在缓存/重用值,至少在select上是这样。我认为这对于非确定性函数调用是不合适的。我在10.0.1600和10.50.1600 2008 RTM以及2008R2 RTM上得到了类似的结果。

Edit:实际上,我在此处向WHERE语句添加了计数器,因此生成随机数不会有问题,而是更新变量,对吗?在显示@Id之后,您从未将其设置回0,因此,如果没有找到任何东西,它将在循环的下一次迭代中再次显示。事实并非如此。双行出现时ID和值不是0。此外,@Id在每次迭代中都会通过select语句进行更新,无论它是否显示。Jason,谢谢你的努力。我看到了和你一样的结果。我还可以通过在递增计数器后设置@Id和@Value NULL来消除重复项。再次感谢。
CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + 1 + @Counter
CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + @Counter + @Counter