달력

11

« 2024/11 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'SQL Server 난수'에 해당되는 글 1

  1. 2011.12.09 SQL Server 난수 처리
2011. 12. 9. 13:36

SQL Server 난수 처리 Work/SQL Server2011. 12. 9. 13:36

구현 목적 : 테이블에서 결과를 가져온 결과셋에서 모든 row에 각기 다른 난수를 발생하게 한다.
구현 1차시도 실패 : SQL Server의 경우  실행시 마다 다른 난수 발생은 문제가 없으나, 결과셋의 row에 난수를 발생시키는 것은 상식적인 구현으로 처리가 안되었음. (Oralce의 경우는 간단한 구현으로 쉽게 됨.)

Oracle의 예 (Oracle 9i) 

SQL> SELECT TNAME, DBMS_RANDOM.value() rv FROM TAB WHERE rownum < 10;

TNAME                                                                RV
------------------------------------------------------------ ----------
APPHIS                                                       .227993266
APPIP                                                        .125859742
APPUSER                                                      .920119229
BIB                                                          .880236699
BIB1                                                         .249643606
BIB2                                                         .079614467
BIB3                                                         .762079535
BTIPC2                                                       .453071388
BTIPC_2                                                      .250049303

9 개의 행이 선택되었습니다.



SQL Server의 예 (SQL Server 2008 R2)

SELECT TOP 9 name, rand() RV FROM sys.objects;
name RV
-------------------------------------

sysrscols 0.374134079506195
sysrowsets 0.374134079506195
sysallocunits 0.374134079506195
sysfiles1 0.374134079506195
syspriorities 0.374134079506195
sysfgfrag 0.374134079506195
sysphfg 0.374134079506195
sysprufiles 0.374134079506195
sysftinds 0.374134079506195

(9개 행이 영향을 받음)

 

위에서 알 수 있듯이 난수 발생 결과 두 DBMS에서 상이하다. (이외에 난수 발생 구간을 설정하는 등에서 난수함수 사용성은 개인적으로 Oracle이 좀 더 편한 듯 하다. 이 부분에 대해서 SQL Server 로 비슷하게 구현하는 것을 목표로 한다.

CREATE VIEW dbo.V_RANDOM
AS
SELECT RAND() AS RN;
GO

CREATE FUNCTION dbo.uf_Random(@iStart int, @iEnd int)
RETURNS float
AS
BEGIN
  DECLARE @result float;
  
  SELECT @result = (@iEnd - @iStart) * RN + @iStart
  FROM dbo.V_RANDOM;

  SET @result = ROUND(@result, 2);
  
  RETURN(@result);
END;
GO

-- TEST
SELECT TOP 9
name, dbo.uf_Random(4, 5) RV
FROM sys.objects;

name RV
sysrscols 4.06
sysrowsets 4.37
sysallocunits 4.6
sysfiles1 4.83
syspriorities 4.03
sysfgfrag 4.43
sysphfg 4.53
sysprufiles 4.72
sysftinds 4.09 


참고글 : http://huhlog.tistory.com/9 
:
Posted by Elick