프로그래밍/DB

[DB] MSSQL 랜덤함수 사용법. rand()

ss-pro 2023. 8. 1. 01:27
반응형

MSSQL에서 난수를 만들기 위해서는 rand()를 사용해서 랜덤값을 만들 수 있습니다. 

1. rand()함수 
MS자료를 보면 아래 같이 설명이 되어있습니다.  0부터 1까지의 의사난수 float값을 반환합니다. 

테스트를 해보면 아래와 같이 0~1사이의 float 난수값을 반환 하는 부분을 확인 할 수 있습니다. 


2. 숫자 랜덤데이터 만들기 
1에서 100까지의 데이터를 난수데이터로 만들어 보겠습니다.  rand()함수의 경우 0~1사이의 float값을 반환하기 때문에 최댓값에 곱을 한 후 1을 더하는 형태로 계산하면 됩니다. 

1
2
3
4
5
6
7
8
9
declare @min int = 1;
declare @max int = 100;
declare @randomNum int;
 
set @randomNum =  cast(@max * RAND() as int)  + 1 ;
if @randomNum < @min
    set @randomNum = @min 
 
select @randomNum
cs


3. 날짜 랜덤데이터 만들기
2023년도 날짜데이터를 임의로 가져오는 함수를 만들어 보겠습니다. 시작일~종료일까지의 날짜 차이를 구한후에 나머지 연산자를 이용하여 @randomNum값을 산정합니다. 해당값을 시작일에서 DateAdd함수를 이용하면 해당범위내의 랜덤값을 가져 올 수 있습니다. 

1
2
3
4
5
6
7
8
9
declare @minDate date = '2023-01-01';
declare @maxDate date = '2023-12-31';
declare @diffNum int;
declare @randomNum int;
 
set @diffNum = DATEDIFF(d,@minDate,@maxDate)
set @randomNum = (cast(@diffNum * rand() as int+ 1)   % @diffNum;
 
select dateadd(d,@randomNum,@minDate)
cs

 

4. 숫자 랜덤데이터 사용자 함수 만들기
사용자 함수를 만들어서 숫자값을 편리하게 가져올 수 있도록 해보겠습니다. 위 2번항목에서 테스트한 부분을 함수로 변경해보면 아래와 같이 "함수 내에서 파생 작업을 생성하는 연산자 'rand'을(를) 잘못 사용했습니다" 라는 오류가 발생하는 부분을 확인 할 수 있습니다. 사용자 정의함수에서는 rand()함수 호출을 제한하고 있어서 해당부분을 사용을 할 수 없습니다. 

이 경우에는 약간의 편법을 사용해서 처리가 가능합니다. rand()함수를 사용자함수내에 사용을 못하기 때문에 random함수를 뷰테이블로 만든후에 사용하는 방법이 있습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create view vRandom 
as 
select rand() random
 
create function dbo.GetRandomInt(@min int , @max int)
returns int 
as 
begin
    declare @randomNum int;
    declare @randomData float;
 
    select @randomData = random  from dbo.vRandom
    set @randomNum =   @max * @randomData    + 1 ;
    if @randomNum < @min
        set @randomNum = @min 
    return  @randomNum   
end
cs

 


5. 날짜 랜덤데이터  사용자정의 함수 만들기 
날짜 랜덤데이터를 생성해주는 사용자 함수를 만들어 보겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create view vRandom 
as 
select rand() random
 
 
create function dbo.GetRandomDate(@minDate datetime , @maxDate datetime)
returns datetime 
begin
    declare @diffNum int;
    declare @randomNum int;
    declare @randomData float;
 
    select @randomData = random  from dbo.vRandom
    set @diffNum = DATEDIFF(d,@minDate,@maxDate)
    set @randomNum = (cast(@diffNum * @randomData as int+ 1)   % @diffNum;
 
    return dateadd(d,@randomNum,@minDate)
end
cs

날짜랜덤값 정보가져오는 사용자 함수 호출결과 예시입니다. 

Rand()함수를 사용해서 랜덤값을 만드는 방법에 대해 알아 보았습니다. 랜덤함수의 경우는 테스트 데이터를 만들때 사용하면 유용하게 사용 할 수 있습니다. 

참고
https://learn.microsoft.com/ko-kr/sql/t-sql/functions/rand-transact-sql?view=sql-server-ver16 
https://www.mssqltips.com/sqlservertip/3297/create-your-own-randbetween-function-in-tsql/