[MSSQL] 2020년생 주민등록번호 유효성 검사 체크 부탁드립니다. 0 3 402

by holland100 [SQL Query] 주민등록번호 유효성검사 [2021.01.20 15:53:57]


안녕하세요.  주민등록번호 유효성 검사 함수를 아래와 같이 만들었는데요.

2020년생인 201209-4444444 번호가

리턴값이 1이 아니라 0으로 나와서 오류가 됩니다.

1이 정상이고 0이 오류인데 왜 그런지 봐주실 수 있으신가요?

감사합니다.

 

 

 

ALTER FUNCTION [dbo].[fnResIdChk]
(
        @NUM VARCHAR(15) --주민등록번호
)

RETURNS CHAR(1) AS
BEGIN

DECLARE    @WK_JUMIN_NO    VARCHAR(13),
        @WK_CHECK_BIT    VARCHAR(12) = '234567892345', --검증값   
        @WK_TOTAL        INT    = 0,
        @WK_RESULT        INT    = 0,
        @WK_RETURN        INT    = 0,  
        @LOOP            INT    = 0
  BEGIN
    
        SET @WK_JUMIN_NO = REPLACE(@NUM, '-', '')

        IF ISNUMERIC(@WK_JUMIN_NO) = 0
            RETURN '0'
        
        SET @LOOP = 1
        WHILE @LOOP <= 12
        BEGIN
           SET @WK_TOTAL = @WK_TOTAL  
                         + CONVERT(INT, SUBSTRING(@WK_JUMIN_NO, @LOOP, 1)) 
                         * CONVERT(INT, SUBSTRING(@WK_CHECK_BIT, @LOOP, 1))

            SET @LOOP += 1
        END
        
        --외국인
        IF SUBSTRING(@WK_JUMIN_NO, 7, 1) IN ('5', '6', '7', '8')
            SET @WK_RESULT    = (13 - (@WK_TOTAL % 11)) % 10
        --내국인
        ELSE 
            SET @WK_RESULT    = (11 - (@WK_TOTAL % 11)) % 10

        
        IF SUBSTRING(@WK_JUMIN_NO,13,1) = CONVERT(VARCHAR, @WK_RESULT)
            SET @WK_RETURN = 1
        ELSE
            SET @WK_RETURN = 0
    END 

    RETURN CONVERT(VARCHAR, @WK_RETURN)

by 마농 [2021.01.20 16:28:42]

오류 번호 맞는데요?
그런데, 이거 테스트용 가짜 번호인가요?
진짜 주민번호라면 이런데 올리면 안될텐데요....

WITH t AS
(
SELECT '201209-4444444' num
UNION ALL SELECT '201209-4444440'
)
SELECT num
     , ( CASE WHEN SUBSTRING(num,  7, 1) IN ('5', '6', '7', '8') THEN 13 ELSE 11 END
       -
       ( SUBSTRING(num,  1, 1) * 2
       + SUBSTRING(num,  2, 1) * 3
       + SUBSTRING(num,  3, 1) * 4
       + SUBSTRING(num,  4, 1) * 5
       + SUBSTRING(num,  5, 1) * 6
       + SUBSTRING(num,  6, 1) * 7
       + SUBSTRING(num,  7, 1) * 8
       + SUBSTRING(num,  8, 1) * 9
       + SUBSTRING(num,  9, 1) * 2
       + SUBSTRING(num, 10, 1) * 3
       + SUBSTRING(num, 11, 1) * 4
       + SUBSTRING(num, 12, 1) * 5
       ) % 11
       ) % 10 v_check
     , SUBSTRING(num, 13, 1) v_13
  FROM (SELECT REPLACE(num, '-', '') num FROM t) a
;

 


by 마농 [2021.01.20 16:42:32]

주민번호 체크비트가 틀린 경우도 가끔 있다고 들은 것 같습니다.
위 주민번호는 빨리 지워주시는 게 좋을 것 같습니다.


by holland100 [2021.01.20 16:45:52]

마농님 감사합니다. 댓글 및 내용 수정했습니다. 내용은 다른 분들도 볼수 있게 해두겠습니다. 나라에서 제공하는 주민등록번호가 다를게 나올수도 있군요. 정보 감사합니다. 늘 잘보고 있습니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입