1

私はProfile列を持つテーブルを持っています: UserID, Firstname,Lastname

@UserIDパラメータを渡し、列から取得した 10 個の乱数を生成するストアド プロシージャを作成しようとしていUserIDます。

これの目的は、1 人のユーザーが 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 セットが返されました。

4

1 に答える 1