使用 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)
我有一个 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)