2016-06-02 30 views
3

Ich möchte nur wissen, wie kann ich die Zufallszahl so einstellen, dass sie zwischen 1-10 liegt und keine Dezimalzahlen wie 0.744545454 anzeigt? Auch wie kann ich jeden Datensatz durch Ausführung durchlaufen, so dass jede Zeile eine eigene Zufallszahl für "PlayerWeighting" enthält?Wie setze ich Zufallszahlen ein?

Unten ist mein gespeicherte Prozedur:

CREATE PROCEDURE [dbo].[Player_CreateWholeTeam] 
    @TeamID INT 

AS 
SET NOCOUNT ON 
BEGIN 
DECLARE @FirstName VARCHAR(25) 
     DECLARE @Surname VARCHAR(25) 
     DECLARE @PlayerWeighting TINYINT 

     SELECT @FirstName = TeamName 
     FROM dbo.Team 
     WHERE TeamID = @TeamID 

     SELECT @Surname = 'Player' + cast(NumberID AS VARCHAR (10)) 
     FROM dbo.Team CROSS JOIN dbo.Number 
     WHERE TeamID = @TeamID 
     ORDER BY TeamID, NumberId 

     SELECT @PlayerWeighting = RAND(1-10) 
     FROM dbo.Player 

    INSERT INTO dbo.Player (FirstName, Surname, PlayerWeighting, TeamID) 
    VALUES (@FirstName, @Surname, @PlayerWeighting, @TeamID) 


END 
+1

'FLOOR (RAND (10)) + 1' einzuschalten. Der zweite 'SELECT' macht keinen Sinn, weil er so aussieht, als würde er mehrere Zeilen zurückgeben. –

Antwort

2

Sie so etwas wie verwenden:

SELECT CONVERT(INT, (RAND() * 10)) 
3

Hier ist einfach Code, um eine Zufallszahl zu generieren:

DECLARE @Random INT; 
DECLARE @Upper INT; 
DECLARE @Lower INT 

---- This will create a random number between 1 and 999 
SET @Lower = 1 ---- The lowest random number 
SET @Upper = 999 ---- The highest random number 
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 
SELECT @Random 

Sie setzen diese in eine Funktion und setzen Sie dann den Wert auf das Ergebnis dieser Funktion, wenn Sie mehrere Zeilen ausführen möchten.

Wenn Sie in einer benutzerdefinierten Funktion verwenden möchten, müssen Sie zuerst eine Ansicht erstellen, da Sie die Funktion RAND() nicht als UDF verwenden können.

Hier ist ein Beispiel dafür, wie dieser Prozess zu tun:

-- View to be used in UDF 
CREATE VIEW Get_RAND 
AS 
SELECT RAND() AS myRand 

GO 

--Simple UDF to get a random number 
CREATE FUNCTION myRandom(@lower INT, @upper INT) 
    RETURNS int 
as 

BEGIN 

DECLARE @Random INT; 

---- This will create a random number between @lower and @upper 
DECLARE @RAND DECIMAL(10,10) = (SELECT myRand FROM Get_RAND) 
set @Random = ROUND(((@Upper - @Lower -1) * @RAND + @Lower), 0) 
RETURN @Random 

END 

-- Use of the function 
SELECT dbo.myRandom(1, 100) 
+0

Ist es in Ordnung, wenn Sie mir ein Beispiel für das Erstellen einer Funktion zeigen, wenn es Ihnen nichts ausmacht? –

+0

Ich habe bearbeitet, um einzuschließen, wie UDF zu haben – Avitus

0
CREATE PROCEDURE [dbo].[Player_CreateWholeTeam] 
    @TeamID INT 

AS 
SET NOCOUNT ON 
BEGIN 

INSERT INTO dbo.Player (FirstName, Surname, PlayerWeighting, TeamID) 
SELECT TeamName as Firstname, 
     'Player' + cast(NumberID AS VARCHAR (10)) as Surname , 
     FLOOR(RAND(Checksum(NEWID()))*(10-1)+1)  as PlayerWeighting , 
     @TeamID as TeamID 
     FROM dbo.Team CROSS JOIN dbo.Number 
     WHERE TeamID = @TeamID 
End 

Ihren Prozedurcode ersetzen, wie oben. Ich füge Datensätze direkt aus dem Ergebnis ausgewählter Abfragen ein. Die Select-Abfrage wird erstellt, indem die vorhandenen Abfragen kombiniert werden. Die Select-Abfrage hilft dabei, eine zufällige Spielergewichtung für jeden Spieler

+0

Wenn diese Auswahlanweisung mehr als eine Reihe zurückgibt, haben sie alle dieselbe Zufallszahl. Der Aufruf von RAND() 'wird als skalare Konstante erweitert. – MatBailie

+0

@matbailie Ich habe meine Zufallszahlenlogik innerhalb einer Funktion platziert. Nun wird es für jede Zeile eine andere Nummer erzeugen. –

+0

Das solltest du testen. Ich glaube, dass sogar Ihre Funktion als skalare Konstante erweitert wird, da sie nur skalare konstante Eingaben hat. Der allgemeine "Trick" besteht darin, NEWID oder etwas Ähnliches als Eingabe zu verwenden, um sicherzustellen, dass keine konstanten Eingaben vorhanden sind. – MatBailie