MSSQL - 난수 쿠폰 코드 생성, 중복 없이 테이블에 등록

쿠폰같은 난수를 생성하고 기존에 있는지 체크한 뒤 없으면 테이블에 입력하는 코드를 적성해봤다.
(본인은 7944-5641-7218 이런 형식의 숫자와 - (하이픈)이 있는 쿠폰 코드를 만들기 위해 코드를 작성했음)

DECLARE @l_S_LIMIT  INT, @l_S_LIMIT2  INT,
   @l_E_LIMIT INT
DECLARE @i    INT
DECLARE @j    INT
DECLARE @randomCode  VARCHAR(12)
DECLARE @randomCodeTmp VARCHAR(1)
DECLARE @sp VARCHAR(1)
DECLARE @makeRandNumbersSet INT
DECLARE @RandNumbersLen INT
DECLARE @incrnum INT
DECLARE @code_total VARCHAR(14)

/*  */
SET @makeRandNumbersSet = 2 /* 쿠폰 난수 작업 횟수*/
SET @RandNumbersLen = 12 /*생성할 난수 자릿수 */
SET @l_S_LIMIT = 1 /*첫번째 자리 숫자가 0이 나오면 숫자가 누락되어 자릿수가 11개가 되기 때문에 시작점을 1부터*/
SET @l_S_LIMIT2 = 0 /*두번째 자리 수자부터는 0부터 */
SET @l_E_LIMIT = 9 /*랜덤 숫자는 위 두 설정 ~9 사이*/
SET @i = 0 
SET @j = 0
SET @sp = '-' /* 쿠폰 코드 중간에 - (하이픈) 문자로 넣으려고*/
SET @randomCode = ''
SET @incrnum = 0

WHILE @j < @makeRandNumbersSet 
/* 쿠폰 생성 작업 반복 시작*/
BEGIN
      WHILE @i < @RandNumbersLen
      BEGIN	
            IF @i = '0' SET @randomCodeTmp = ROUND( ( (@l_E_LIMIT + 1) - @l_S_LIMIT ) * RAND(checksum(newid())) + @l_S_LIMIT , 0, 1)
            /* 첫번째 자리에 0이 오지 않게 하는 조건문*/
            ELSE SET @randomCodeTmp = ROUND( ( (@l_E_LIMIT + 1) - @l_S_LIMIT2 ) * RAND(checksum(newid())) + @l_S_LIMIT2 , 0, 1)    
            SET @randomCode = @randomCode + @randomCodeTmp
            SET @i = @i + 1  
      END

      SET @code_total = SUBSTRING(@randomCode, 1, 4) + @sp + SUBSTRING(@randomCode, 5, 4) + @sp + SUBSTRING(@randomCode, 9, 4)   
      /*  7944-5641-7218 처럼 쿠폰 형식으로 변경 */
      PRINT @code_total
      /* 생성된 코드 확인 */
      
      IF NOT EXISTS(
            /* 테이블에 기존 코드 중에 중복된게 없는지 체크 */
            SELECT * from 테이블 where code = @code_total            
      )
      BEGIN
            /* 중복된 코드가 없다면 등록 */
            INSERT INTO 테이블
                  ([seq], [code], [regdate], [isUsed], [publish_round], [channel])
            VALUES
                  (@incrnum, @code_total, Convert(varchar(30),Getdate(),120), 'N', '3', 'A')
      END

      SET @incrnum = @incrnum + 1
      SET @i = 0;
      SET @randomCode = ''
      SET @j = @j + 1
END

 

Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

0 댓글
Inline Feedbacks
View all comments
TOP