使用Rand时更新的行数不正确(Checksum(Newid()))

时间:2015-09-18 14:27:56

标签: sql-server-2008 random-sample

我有一个返回计数的SP,我需要使用这个计数并更新其他表中的随机行(计数行数),返回的计数总是小于或等于可用的行数,所以随机行应始终可用

下面是我正在使用的方法

我目前有7行用于where子句,返回的计数也是7,但是在不同的尝试中,下面的逻辑标记为5或6行而不是7,是否使用rand函数有一些缺点?

还有其他选择吗?

                  EXEC @Randcount=dbo.[Usp_getcount] 

                        UPDATE [mytable] 
                        SET    [output] = 1 
                        WHERE  [id] IN 
                               (SELECT TOP (@Randcount) 
                               [id]  FROM   [dbo].[mytable] 
                                WHERE 
                               [empid] = @empid  AND [setId] = @setID
                               ORDER  BY Rand(Checksum(Newid()))) 

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在评估子查询的次数上没有保证。如果仅针对整个查询对其进行了一次评估,那么您可能希望更新7行。但是,如果每个外行评估一次,那么它实际上是每行抛硬币。

最简单的方法是将其拆分为两个单独的查询:

EXEC @Randcount=dbo.[Usp_getcount] 

declare @IDs table (ID int not null)

insert into @IDs(ID)
SELECT TOP (@Randcount) 
  [id]  FROM   [dbo].[mytable] 
   WHERE 
 [empid] = @empid  AND [setId] = @setID
ORDER  BY Rand(Checksum(Newid()))

UPDATE [mytable] 
 SET    [output] = 1 
WHERE  [id] IN 
 (SELECT ID from @IDs)