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

Incorrect number of rows updated upon using Rand(Checksum(Newid()))

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

下面是我使用的方法

我目前有 7 行用于 where 子句并且返回的计数也是 7,但是在不同的尝试中,下面的逻辑标记 1 代表 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()))) 

如有任何帮助,我们将不胜感激。

没有保证子查询将被计算多少次。如果只对整个查询求值一次,您会期望得到恰好 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)