mssql2000 身份证号码验证

CREATE VIEW thisDate
--返回当前日期,因为自定义函数中不能使用GETDATE()
AS 
SELECT convert(VARCHAR(8),getdate(),112) AS aDate

Create function Check_Sfz(@sfzh char(18))
/*mssql2000
返回值=0,身份证校验正确 
       1:位数不对 
       2:含有不规则字符  
       3:日期不对 
       4:校验位不对
*/
returns tinyint
as
begin
 set @sfzh=ltrim(rtrim(@sfzh))
 declare @r char(1),@resu TINYINT,@thisDate VARCHAR(8)
 declare @i INT
 SELECT @thisDate=aDate FROM thisDate
 if len(@sfzh) <> 18 
  set @resu=1
 ELSE
 BEGIN
  IF isnumeric(substring(@sfzh,1,17))=0
      --检查前17位是否为数字
     set @resu=2
  ELSE IF isDate(substring(@sfzh,7,8))=0  
     --日期是否符合规则 
     set @resu=3
  ELSE IF (substring(@sfzh,7,4)<'1900') OR (substring(@sfzh,7,8)>=@thisDate)
     --日期是否符合逻辑
     SET @resu=3
  else
  BEGIN 
      --检查第18位数据的正确性
  set @i = cast(substring(@sfzh,1,1) as int) * 7
         + cast(substring(@sfzh,2,1) as int) * 9
         + cast(substring(@sfzh,3,1) as int) * 10
         + cast(substring(@sfzh,4,1) as int) * 5
         + cast(substring(@sfzh,5,1) as int) * 8
         + cast(substring(@sfzh,6,1) as int) * 4
         + cast(substring(@sfzh,7,1) as int) * 2
         + cast(substring(@sfzh,8,1) as int) * 1
         + cast(substring(@sfzh,9,1) as int) * 6
         + cast(substring(@sfzh,10,1) as int) * 3
         + cast(substring(@sfzh,11,1) as int) * 7
         + cast(substring(@sfzh,12,1) as int) * 9
         + cast(substring(@sfzh,13,1) as int) * 10
         + cast(substring(@sfzh,14,1) as int) * 5
         + cast(substring(@sfzh,15,1) as int) * 8
         + cast(substring(@sfzh,16,1) as int) * 4  
         + cast(substring(@sfzh,17,1) as int) * 2
   set @i = @i - @i/11 * 11
   set @r = (case @i 
   when 0 then '1' when 1 then '0' when 2 then 'x' when 3 then '9'
   when 4 then '8' when 5 then '7' when 6 then '6' when 7 then '5'
   when 8 then '4' when 9 then '3' when 10 then '2' else '/' end)
   IF @r=lower(substring(@sfzh,18,1)) set @resu=0
   ELSE SET @resu=4--验证位不正确
  end
 end
 return(@resu) 
END

 

转载于:https://www.cnblogs.com/ByBull/p/4664543.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值