2016-06-02 2 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 

위와 같이 프로 시저 코드를 교체합니다. select 쿼리 결과에서 레코드를 직접 삽입하려고합니다. 선택 쿼리는 기존 쿼리를 결합하여 이루어집니다. 선택 쿼리는 각 플레이어의 무작위 플레이어 가중치를 묻는 데 도움이됩니다.

+0

해당 select 문이 둘 이상의 행을 반환하면 모두 동일한 난수입니다. 'RAND()'호출은 스칼라 상수로 확장됩니다. – MatBailie

+0

@matbailie 함수 내에 난수 논리를 배치했습니다. 이제 각 행마다 다른 번호가 생성됩니다. –

+0

테스트해야합니다. 필자의 함수조차도 스칼라 상수로 확장되므로 스칼라 상수 입력 만 있기 때문에 믿습니다. 일반적인 "속임수"는 NEWID 또는 유사한 것을 입력으로 사용하여 지속적인 입력이 없는지 확인하는 것입니다. – MatBailie

관련 문제