2011. 12. 9. 13:36
SQL Server 난수 처리 Work/SQL Server2011. 12. 9. 13:36
구현 목적 : 테이블에서 결과를 가져온 결과셋에서 모든 row에 각기 다른 난수를 발생하게 한다.
구현 1차시도 실패 : SQL Server의 경우 실행시 마다 다른 난수 발생은 문제가 없으나, 결과셋의 row에 난수를 발생시키는 것은 상식적인 구현으로 처리가 안되었음. (Oralce의 경우는 간단한 구현으로 쉽게 됨.)
Oracle의 예 (Oracle 9i)
구현 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