(转)身份证验证算法(SQL版)


/*
验证身份证算法
By:刘志伟
2008-1-29与天津
*/

CREATE FUNCTION [fn_ValidateIDC]
(
@idc varchar(18)
)
RETURNS BIT
AS
BEGIN
IF LEN(@idc)<>15 AND LEN(@idc)<>18--身份证号只有15或18位
RETURN(0)
IF LEN(@idc)=15  --如果是15位身份证 则只验证日期和是否数字格式
   IF ISDATE('19'+SUBSTRING(@idc,7,6))=0 OR ISNUMERIC(@idc)=0
       
RETURN(0)
    
ELSE
       
RETURN(1)
/**//*
18位身份证 验证日期 校验位
*/

IF ISDATE(SUBSTRING(@idc,7,8))=0 OR ISNUMERIC(SUBSTRING(@idc,1,17))=0--验证日期和前17位是否数字格式
   RETURN(0)
/**//*验证校验位开始*/
DECLARE @validFactors VARCHAR(17),@validCodes VARCHAR(11),@i TINYINT,@iTemp INT
SELECT @validFactors='79A584216379A5842',@validCodes='10X98765432',@i=1,@iTemp=0
WHILE @i<18
   
BEGIN
      
SELECT @iTemp=@iTemp+CAST(SUBSTRING(@idc,@i,1AS INT)*(CASE SUBSTRING(@validFactors,@i,1WHEN 'A' THEN 10 ELSE SUBSTRING(@validFactors,@i,1END)
            ,
@i=@i+1
   
END
IF SUBSTRING(@validCodes,@iTemp%11+1,1)=RIGHT(@idc,1)
   
RETURN 1
ELSE
   
RETURN 0
RETURN NULL
END

GO

 

posted on 2008-07-25 09:29  冷月孤峰  阅读(504)  评论(1)    收藏  举报