私は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 セットが返されました。