我有一个返回计数的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())))
任何帮助将不胜感激。
答案 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)