1

我有一个Profile包含列的表:UserID, Firstname,Lastname

我正在尝试创建一个传递@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

我传入用户 ID '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 集。

4

1 回答 1

3

您可以尝试使用 newid():

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

通过这种方式,您可以获得十个不同的用户,这些用户不是您传入参数的用户。但我不知道如何在 SQL Server 中获得非常好的随机性。

编辑:

我认为您也可以将 tablesample() 用于此类问题,但我真的不知道如何使用它。

顺便说一句,如果 id 序列中出现了一个洞(比如用户 34 被删除),您仍然可以使用您的方法选择 34,而直接从表中提取样本的方法仍然有效。

于 2013-07-04T15:04:24.313 回答