MSSQL에서 랜덤하게 패스워드를 생성해야 하거나 쿠폰번호 등을 생성해야 할 때 일정한 범위내에서 랜덤한 문자열을 생성해보자.
RAND BETWEEN 함수를 사용해서 일정 범위 내에서 난수를 발생시키는 원리이다.
예를 들어 5~25 사이 난수를 생성하려면 다음처럼 하면된다.
SELECT CAST(20*RAND() + 5 AS INT)
만약 5~25사이의 난수 중에서 총 5자리에 소수점 1자리까지 표현하려면 다음과 같다
SELECT CAST(20*RAND() + 5 AS DECIMAL(5,1))
-- 먼저 RANDBETWEEN 함수를 만든다
CREATE VIEW VRANDOMNUMBER
AS
SELECT RAND() AS RANDOMNUMBER
GO
CREATE FUNCTION RANDBETWEEN(@BOTTOM INT, @TOP INT)
RETURNS INT
AS
BEGIN
RETURN (SELECT CAST(ROUND((@TOP-@BOTTOM)* RANDOMNUMBER + @BOTTOM,0) AS INTEGER) FROM VRANDOMNUMBER)
END
GO
--그리고 랜덤 스트링 생성 함수를 생성한다
CREATE FUNCTION dbo.GeneratePassword ()
RETURNS varchar(10)
AS
BEGIN
DECLARE @randInt int;
DECLARE @NewCharacter varchar(1);
DECLARE @NewPassword varchar(10);
SET @NewPassword='';
--6 random characters
WHILE (LEN(@NewPassword) <6)
BEGIN
select @randInt=dbo.randbetween(48,122)
-- 0-9 < = > ? @ A-Z [ \ ] a-z
IF @randInt<=57 OR (@randInt>=60 AND @randInt<=93) OR (@randInt>=97 AND @randInt<=122)
Begin
select @NewCharacter=CHAR(@randInt)
select @NewPassword=CONCAT(@NewPassword, @NewCharacter)
END
END
--Ensure a lowercase
select @NewCharacter=CHAR(dbo.randbetween(97,122))
select @NewPassword=CONCAT(@NewPassword, @NewCharacter)
--Ensure an upper case
select @NewCharacter=CHAR(dbo.randbetween(65,90))
select @NewPassword=CONCAT(@NewPassword, @NewCharacter)
--Ensure a number
select @NewCharacter=CHAR(dbo.randbetween(48,57))
select @NewPassword=CONCAT(@NewPassword, @NewCharacter)
--Ensure a symbol
WHILE (LEN(@NewPassword) <10)
BEGIN
select @randInt=dbo.randbetween(33,64)
-- ! # $ % & < = > ? @
IF @randInt=33 OR (@randInt>=35 AND @randInt<=38) OR (@randInt>=60 AND @randInt<=64)
Begin
select @NewCharacter=CHAR(@randInt)
select @NewPassword=CONCAT(@NewPassword, @NewCharacter)
END
END
RETURN(@NewPassword);
END;
GO
-- 이제 GeneratePassword() 함수를 통해 랜덤하게 캐릭터를 생성해보자
SELECT dbo.GeneratePassword() AS 'NewPassword';
SELECT dbo.GeneratePassword() AS 'NewPassword';
SELECT dbo.GeneratePassword() AS 'NewPassword';
출처 - sqler.com
'Programming > MSSQL' 카테고리의 다른 글
클러스터드 인덱스 DROP 후 RECREATE 하기 (0) | 2018.07.16 |
---|---|
MSSQL 테이블 권한 조회(확인)하고 GRANT 문 만들기 (0) | 2018.06.09 |
MSSQL 인덱스 조각화 확인 및 해결책(DBCC SHOWCONTIG, ALTER INDEX REBUILD) (0) | 2018.04.28 |
MSSQL 인덱스 생성 CREATE INDEX (CLUSTRED, NONCLUSTRED, INCLUDED, FILTERED INDEX) (122) | 2018.04.25 |
MSSQL 날짜 변환 (DATE CONVERT) (122) | 2018.04.24 |