1. 程式人生 > 其它 >sql校驗身份證有效性-18位

sql校驗身份證有效性-18位

--呼叫方法 select  dbo.wsh_sfzjy ('身份證號')

ALTER FUNCTION [dbo].[wsh_sfzjy] 
( 
 @sfz varchar(20) 
) 
RETURNS varchar(100) 

AS 
BEGIN
DECLARE @PY varchar(100) 
DECLARE @tou varchar(100) 
DECLARE @wei varchar(100) 
DECLARE @jiaoyan varchar(100) 
set @tou=''
set @wei=''

if( LEN(@sfz)=18)
BEGIN
set @tou=substring(@sfz,1,17)
set @wei=substring(@sfz,18,1)
END
 else 
if(LEN(@sfz)=17)
BEGIN
set @tou=@sfz
end


  if(@tou<>'')
BEGIN
 
with sfz as (SELECT @tou as pspt_id)
 select
    /*pspt_id為使用者身份證號碼前17位*/
   
   @jiaoyan=( case
when substring(a.pspt_id,11,2) not between '01' and '12' then 'cuowu'
when substring(a.pspt_id,13,2) not between '01' and '31' then 'cuowu'
when ( 12-
             (( 
                substring(a.pspt_id,1,1)*7+ 
                substring(a.pspt_id,2,1)*9+ 
                substring(a.pspt_id,3,1)*10+ 
                substring(a.pspt_id,4,1)*5+ 
                substring(a.pspt_id,5,1)*8+ 
                substring(a.pspt_id,6,1)*4+ 
                substring(a.pspt_id,7,1)*2+ 
                substring(a.pspt_id,8,1)*1+ 
                substring(a.pspt_id,9,1)*6+ 
                substring(a.pspt_id,10,1)*3+ 
                substring(a.pspt_id,11,1)*7+ 
                substring(a.pspt_id,12,1)*9+ 
                substring(a.pspt_id,13,1)*10+ 
                substring(a.pspt_id,14,1)*5+ 
                substring(a.pspt_id,15,1)*8+ 
                substring(a.pspt_id,16,1)*4+ 
                substring(a.pspt_id,17,1)*2 
            )%11) )%11=10 then 'x'
      else CONVERT(VARCHAR(5),( 12-
             (( 
                substring(a.pspt_id,1,1)*7+ 
                substring(a.pspt_id,2,1)*9+ 
                substring(a.pspt_id,3,1)*10+ 
                substring(a.pspt_id,4,1)*5+ 
                substring(a.pspt_id,5,1)*8+ 
                substring(a.pspt_id,6,1)*4+ 
                substring(a.pspt_id,7,1)*2+ 
                substring(a.pspt_id,8,1)*1+ 
                substring(a.pspt_id,9,1)*6+ 
                substring(a.pspt_id,10,1)*3+ 
                substring(a.pspt_id,11,1)*7+ 
                substring(a.pspt_id,12,1)*9+ 
                substring(a.pspt_id,13,1)*10+ 
                substring(a.pspt_id,14,1)*5+ 
                substring(a.pspt_id,15,1)*8+ 
                substring(a.pspt_id,16,1)*4+ 
                substring(a.pspt_id,17,1)*2 
            )%11) )%11)
end     )       
from sfz a  
 END
if(@tou='') set @PY='輸入錯誤'
ELSE if(@jiaoyan='cuowu') set @PY='輸入錯誤'
else if (@wei=@jiaoyan) set @PY=@sfz
else if ( @wei='')   set @PY=CONVERT(VARCHAR(50),@sfz)+@jiaoyan
else  set @PY='輸入錯誤'
--set @PY=@sfz17+' '+@PY
 
RETURN @PY 
END

  

 

 

 

第二代身份證號組成規則:

a) 身份證號碼(18位)= 地址碼(6)+ 出生日期碼(8)+ 順序碼(3)+校驗碼(1);

b) 地址碼:保證位數合法即可,無需校驗合法性;

c) 出生日期碼:格式為YYYYMMDD,需校驗日期有效性;

d) 順序碼:男性為奇數,女性為偶數;

e) 校驗碼:

S = ∑(i = 1, 17) { A[i] * W[i] }

Y = S % 11

校驗碼 N = (12 - Y) % 11

所以N取值範圍是0-10,10在身份證號碼中用大寫字母'X'表示

i:表示號碼字元從左至右不包括校驗碼字元在內的位置序號

A[i]:表示第i位置上的身份證號碼字元值

W[i]:表示第i位置上的加權係數,其數列為7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2