1、 简单的检验 ,不校验校验位:
createFUNCTION[fn_ValidateIDC]
(
@idcvarchar(18)
)RETURNSBIT
AS
begin
if(isnumeric(@idc)=1andlen(@idc)=15andisdate(substring(@idc,7,6))=1
and(right(@idc,1)='0'orright(@idc,1)='1'))
or(len(@idc)=18andisnumeric(left(@idc,17))=1andisdate(substring(@idc,7,8))=1
andpatindex('%[X0-9]%',right(@idc,1))>0)
return1
return0
end
go
selectdbo.fn_ValidateIDC('12345619780901231X')
dropfunctionfn_ValidateIDC
上面的代码仅检查位数及相应日期位是否合理,不作深内校验,上面的代码 可以简单修改给表的列上做check,网友自行修改。
2、 如果要严格来校验,现我把一个网友(loworth )的代码进行修改整理给大家看:
CREATEFUNCTION[fn_ValidateIDC]
(
@idcvarchar(18)
)RETURNSBIT
AS
BEGIN
DECLARE@validFactorsVARCHAR(17),@validCodesVARCHAR(11),@iTINYINT,@iTempINT
SELECT@validFactors='79A584216379A5842',@validCodes='10X98765432',@i=1,@iTemp=0
--验证校验位
IFLEN(@idc)<>15ANDLEN(@idc)<>18--身份证号只有15或18位
RETURN(0)
IFLEN(@idc)=15--如果是15位身份证则只验证日期
IF(ISDATE('19'+SUBSTRING(@idc,7,6))=0and'19'+SUBSTRING(@idc,7,6)between'1900-01-01'and'2010-01-01')
RETURN(0)
ELSE
RETURN(1)
--18位身份证验证日期校验位
IF(ISDATE(SUBSTRING(@idc,7,8))=0andSUBSTRING(@idc,7,6)between'1900-01-01'and'2010-01-01')--验证日期
RETURN(0)
---验证校验位开始
WHILE@i<18
BEGIN
SELECT@iTemp=@iTemp+CAST(SUBSTRING(@idc,@i,1)ASINT)*
(CASESUBSTRING(@validFactors,@i,1)WHEN'A'THEN10ELSESUBSTRING(@validFactors,@i,1)END)
,@i=@i+1
END
IFSUBSTRING(@validCodes,@iTemp%11+1,1)=RIGHT(@idc,1)
RETURN1
ELSE
RETURN0
RETURN0
END
GO
测试:
selectdbo.fn_ValidateIDC('32108519**05026619')
/**//*
------
**大家用合法身份证号测试
*/
清理 :

dropfunctionfn_ValidateIDC
本文提供两种身份证号码验证方法:一种是简单验证,主要检查位数和日期格式;另一种是严格验证,除了检查位数和日期外,还通过加权求和的方式验证校验位。
2668

被折叠的 条评论
为什么被折叠?



