1

我有一个Profile表列:UserIDFirstnameLastname如何生成从列随机数字,没有重复 - SQL服务器

我想创造出通过在@UserID参数的存储过程,并从UserID列中生成10个随机数。

这样做的目的是为了让一个用户将消息发送给10个随机用户(没有任何重复)

以下是我迄今为止:

CREATE PROCEDURE [dbo].[Random10] 
@UserID INT 
AS 
DECLARE @MaxID INT, @MinID INT, @RandomID INT, @Index INT 

SET @MinID = (SELECT MIN(P.UserID) FROM Profile P) 
SET @MaxID = (SELECT MAX(P.UserID) FROM Profile P) 
SET @Index = 0 

CREATE TABLE #RandomUsers 
(
ID INT PRIMARY KEY IDENTITY, 
UserID INT 
) 


WHILE @Index < 10 
BEGIN 
    SELECT @RandomID = ROUND(((@MaxID - @MinID - 1) * RAND() + @MinID), 0) 

    IF (@RandomID <> @UserID) 
    BEGIN 
     INSERT INTO #RandomUsers VALUES (@RandomID) 
     SET @Index = @Index + 1 
    END 
ELSE 
    BEGIN 
     SET @Index = @Index 
    END 
END 

SELECT * FROM #RandomUsers 

我传递UserID'66'并使用'WHILE LOOP'和'RAND()'生成10个数字。该“IF”语句用来消除出现在列表中的“@UserID”参数(因为这将是发送邮件的用户)

下面是结果:

|ID|UserID| 
| 1| 66| 
| 2| 80| 
| 3| 66| 
| 4| 64| 
| 5| 14| 
| 6| 72| 
| 7| 72| 
| 8| 81| 
| 9| 19| 
|10| 56| 

,你可以看到有一些重复。

我试图添加一个WHERE子句来消除这两个问题,但我然后得到一个返回的NULL集。

回答

3

()你可以尝试使用NEWID:

INSERT INTO #RandomUsers 
Select TOP 10 userId From Profile WHERE userId <> @UserID 
ORDER BY newid() 

这样,你得到的是不是你在参数中传递的一个十个不同的用户。但我不知道如何在SQL Server中获得非常好的随机性。

编辑:

我想你也可以使用TABLESAMPLE()这类问题,但我真的不知道如何使用这个。顺便说一句,如果一个洞出现在id序列中(像用户34被删除),你仍然可以用你的方法选择34,而直接从表中取样的方法仍然可以工作。

+0

谢谢你的快速答案Jonathon!我已经尝试过你的解决方案,它完美的工作。但我也会接受你的建议,并研究'tablesample()'函数。 再次感谢您的帮助! – TreasaNGC