2016-06-02 6 views
3

Я просто хочу знать, как установить случайное число так, чтобы оно находилось между 1-10 и не отображало десятичные числа, например 0.744545454? Также как я могу перебирать каждую запись с помощью выполнения, чтобы каждая строка содержала свое собственное случайное число для «PlayerWeighting»?Как установить случайные числа

Ниже мое ХП:

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'. Второй «SELECT» на самом деле не имеет смысла, потому что похоже, что он вернет несколько строк. –

ответ

2

Вы могли бы использовать что-то вроде:

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

Вот простой код для генерации случайных чисел:

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 

Вы можете поместить это в функцию, а затем установите значение для результата этой функции, если вы хотите сделать несколько строк.

Если вы хотите использовать в пользовательской функции, вам нужно сначала создать представление, потому что вы не можете использовать функцию RAND() UDF.

Вот пример того, как сделать этот процесс:

-- 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

Это нормально, если вы покажете мне пример создания функции, если вы не возражаете, пожалуйста? –

+0

Я отредактировал, чтобы указать, как иметь UDF – 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 

Заменить Ваш код процедуры, как указано выше. Я вставляю записи непосредственно из результатов выбранных запросов. Выбирается запрос, объединяющий существующие запросы. Запрос выбора поможет установить взвешивание случайных игроков для каждого игрока.

+0

Если этот оператор select возвращает более одной строки, все они будут иметь одинаковое случайное число. Вызов RAND() разворачивается как скалярная константа. – MatBailie

+0

@matbailie Я поставил свою логику случайных чисел внутри функции. Теперь он будет генерировать различное количество для каждой строки. –

+0

Вы должны проверить это. Я считаю, что даже ваша функция расширяется как скалярная константа, так как она имеет только скалярные постоянные входы. Общий «трюк» заключается в том, чтобы использовать NEWID или что-то подобное, как вход для обеспечения отсутствия постоянных входов. – MatBailie

Смежные вопросы