쓸만한 주저리

mssql에서 rand 함수 초기화하기

봄돌73 2009. 3. 12. 13:43

참고 : http://huhlog.tistory.com/entry/MS-SQL-Rand-%ED%95%A8%EC%88%98-%ED%8C%81%EC%97%AC%EB%9F%AC%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%B8%EC%B6%9C%EC%8B%9C-%EB%82%9C%EC%88%98%EB%B0%9C%EC%83%9D



test db를 만들려다 보니 무작위 값이 여러 개 들어가는 테이블이 필요하게 되었다.

그래서 간단하게 rand()를 사용했는데 전부 똑같은 값이 들어가기에 초기화가 필요하게 되었다.

함수 사용법이 비슷한 asp에서는 randomize를 사용하면 초기화가 이루어져서

다시 무작위 값이 나오게 된다.

하지만 mssql에서는 그런 게 없다.

여기저기 뒤지다 참고에 연결해 놓은 글을 발견했다.

딱 내가 찾던 것인데, 마지막 해결법에 오류가 있어서 그 부분만 수정한다.


1. 일단 난수를 리턴하는 뷰를 생성합니다.
CREATE VIEW dbo.rand_view
AS
SELECT RAND() AS random_num

2. 1에서 만든 뷰를 사용자정의 함수에서 사용
CREATE FUNCTION dbo.rndNum(@i INT)
RETURNS INT
AS
BEGIN
  DECLARE @result INT;
  SELECT @result = CONVERT(INT, RAND() * @i)
  FROM dbo.rand_view;
  RETURN(@result);
END


3. 위에서 만든 사용자정의 함수를 쿼리문에 사용
SELECT a, b, c, dbo.rndNum(5) AS random_num
FROM table_name


위의 빨간 부분이 오류이다.

아래와 같이 하면 오류가 없다.


1. 일단 난수를 리턴하는 뷰를 생성합니다.
CREATE VIEW dbo.rand_view
AS
SELECT RAND() AS random_num

2. 1에서 만든 뷰를 사용자정의 함수에서 사용
CREATE FUNCTION dbo.rndNum(@i INT)
RETURNS INT
AS
BEGIN
  DECLARE @result INT;
  SELECT @result = CONVERT(INT, random_num*@i)
  FROM dbo.rand_view;
  RETURN(@result);
END


3. 위에서 만든 사용자정의 함수를 쿼리문에 사용
SELECT a, b, c, dbo.rndNum(5) AS random_num
FROM table_name