SQL 校验身份证格式

USE [LoanManagement]
GO
/****** Object:  UserDefinedFunction [dbo].[fn_IDCardChk]    Script Date: 2019/5/17 14:05:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
---------------------------
编制人:Denghejing
功能描述:校验身份证号是否有效 成功返回1 失败返回0
2019-05-16

调用:select [dbo].[fn_IDCardChk]('145124512121')
---------------------------
*/
ALTER FUNCTION [dbo].[fn_IDCardChk] ( @IDCard VARCHAR(18) )
RETURNS BIT
AS
    BEGIN
        IF LEN(@IDCard) <> 15
            AND LEN(@IDCard) <> 18--身份证号只有15或18位
            RETURN(0);
            --如果是15位身份证 则只验证日期和是否数字格式
        IF LEN(@IDCard) = 15
            IF ISDATE('19' + SUBSTRING(@IDCard, 7, 6)) = 0
                OR ISNUMERIC(@IDCard) = 0
                RETURN(0);
            ELSE
                RETURN(1);
 
        --18位身份证 验证日期 校验位
        IF ISDATE(SUBSTRING(@IDCard, 7, 8)) = 0
            OR ISNUMERIC(SUBSTRING(@IDCard, 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(@IDCard, @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(@IDCard, 1)
            RETURN 1;
        ELSE
            RETURN 0;
        RETURN NULL;
    END;
 
 

居民身份证查询验证:http://www.ip33.com/shenfenzheng.html

转载于:https://www.cnblogs.com/Denghejing/p/10881020.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值