T-sql 验证身份证算法

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值