• sql server中使用函数验证身份证号码是否合法


     1 SET ANSI_NULLS ON
     2 GO
     3 SET QUOTED_IDENTIFIER ON
     4 GO
     5 -- =============================================
     6 -- Author:<Author,,Name >
     7 -- Create date: <Create Date, , >
     8 -- Description: <Description, , >
     9 -- =============================================
    10 ALTER FUNCTION [dbo].[fn_IsValidIDCard]
    11 (
    12     @IDCardNo varchar(50)=''
    13 )
    14 RETURNS bit
    15 AS
    16 /*******************************************************************
    17 函数名称:fn_IsvalidIDCard()
    18 参数:@IDCardNo string 身份证号码
    19 返回值:  bit 是否有效
    20 功能描述:判断身份证号码是否合法
    21 
    22 备注:目前中国的身份证号码有18位和15位.
    23 1,18位身份证号码的组成:6位地区编码+8位出生年月日+3位编号(奇男偶女)+1位校验码
    24 2,15位身份证号码的组成:6位地区编码+6位出生年月日+3位编号(奇男偶女)
    25 *******************************************************************/
    26 BEGIN
    27 
    28 declare @Length int, 
    29 @Loop int, 
    30 @Sum int
    31 declare @SingleChar char
    32 
    33 set @Sum = 0
    34 if @IDCardNo is null or @IDCardNo = null or ltrim(rtrim(@IDCardNo)) = ''
    35     begin
    36         return 0
    37     end
    38 
    39 set @Length = len(@IDCardNo)
    40 --判断位数
    41 if @Length < > 18 and @Length < > 15
    42     begin
    43         return 0
    44     end
    45 
    46 if @Length = 18
    47 begin
    48     if isnumeric(left(@IDCardNo, 17)) = 0
    49         begin
    50             return 0
    51         end
    52     if isdate(substring(@IDCardNo, 7, 4) + '-' + substring(@IDCardNo, 11, 2) + '-' + substring(@IDCardNo, 13, 2)) = 0 
    53         begin
    54             return 0
    55         end
    56     set @Loop = 17
    57     while (@Loop  >= 1)
    58         begin
    59             set @Sum = @Sum + convert(int,substring(@IDCardNo, @Loop, 1)) * (power(2,(18 - @Loop)) % 11)
    60             set @Loop = @Loop - 1
    61         end
    62     set @Loop = @Sum % 11
    63     if @Loop = 0
    64         begin
    65             set @SingleChar = '1'
    66         end
    67     else if @Loop = 1
    68         begin
    69             set @SingleChar = '0'
    70         end
    71     else if @Loop = 2
    72         begin
    73             set @SingleChar = 'X'
    74         end
    75     else
    76         begin
    77             set @SingleChar = convert(varchar(2),(12 - @Loop))
    78         end
    79     if lower(Right(@IDCardNo, 1)) < > lower(@SingleChar)
    80         begin
    81             return 0
    82         end
    83 end
    84 else if @Length = 15
    85 begin
    86     if isnumeric(@IDCardNo) = 0
    87         begin
    88             return 0
    89         end
    90     if isdate('19' + substring(@IDCardNo, 7, 2) + '-' + substring(@IDCardNo, 9, 2) + '-' + substring(@IDCardNo, 11, 2)) = 0 
    91         begin
    92             return 0
    93         end
    94 end
    95 
    96     return 1
    97 
    98 END
  • 相关阅读:
    通过唯一ID实现简单的日志跟踪实现
    从零单排入门机器学习:Octave/matlab的经常使用知识之矩阵和向量
    zoj 1671 Walking Ant
    JDBC基础
    Android从源码看ListView的重用机制
    JavaScript设计模式 Item9 --适配器模式Adapter
    C++11新特性之 std::forward(完美转发)
    [组合数]求组合数的几种方法总结
    HDU 4005 The war(双连通好题)
    Workspace in use or cannot be created, choose a different one.--错误解决的方法
  • 原文地址:https://www.cnblogs.com/lgx5/p/15661911.html
Copyright © 2020-2023  润新知