T-sql 验证身份证算法

1、  简单的检验 ,不校验校验位:

 

create   FUNCTION   [ fn_ValidateIDC ]
(
@idc   varchar ( 18 )
)
RETURNS   BIT
AS
begin
if   ( isnumeric ( @idc ) = 1   and   len ( @idc ) = 15   and   isdate ( substring ( @idc  , 7 , 6 )) = 1
and  ( right ( @idc  , 1 ) = ' 0 '   or   right ( @idc  , 1 ) = ' 1 ' ))

or  ( len ( @idc  ) = 18   and   isnumeric ( left ( @idc  , 17 )) = 1   and   isdate ( substring ( @idc  , 7 , 8 )) = 1  
   
and   patindex ( ' %[X0-9]% ' , right ( @idc  , 1 )) > 0 )
    
return   1
return   0
    
end

go

select  dbo.fn_ValidateIDC( ' 12345619780901231X ' )
drop   function  fn_ValidateIDC

       上面的代码仅检查位数及相应日期位是否合理,不作深内校验,上面的代码 可以简单修改给表的列上做check,网友自行修改。

2、        如果要严格来校验,现我把一个网友(loworth )的代码进行修改整理给大家看:

 

CREATE   FUNCTION   [ fn_ValidateIDC ]
(
 
@idc   varchar ( 18 )
)
RETURNS   BIT
AS
BEGIN

 
DECLARE   @validFactors   VARCHAR ( 17 ), @validCodes   VARCHAR ( 11 ), @i   TINYINT , @iTemp   INT
 
SELECT   @validFactors = ' 79A584216379A5842 ' , @validCodes = ' 10X98765432 ' , @i = 1 , @iTemp = 0
 
-- 验证校验位
 
 
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   and   ' 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 )) = 0   and   SUBSTRING ( @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 AS   INT ) *
             (
CASE   SUBSTRING ( @validFactors , @i , 1 WHEN   ' A '   THEN   10   ELSE   SUBSTRING ( @validFactors , @i , 1 END )
             ,
@i = @i + 1
    
END
 
IF   SUBSTRING ( @validCodes , @iTemp % 11 + 1 , 1 ) = RIGHT ( @idc , 1 )
    
RETURN   1
 
ELSE
    
RETURN   0
 
RETURN   0
END
GO

 

测试:

 

select  dbo.fn_ValidateIDC( ' 32108519**05026619 ' )
/*
------
**  大家用合法身份证号测试
*/

 清理 :

 


drop   function  fn_ValidateIDC
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值