Author:水如烟

SQLServer2005 身份证函数,含验证和15位转18位

USE   [ LzmTWWorks ]
GO
/* ***** 对象:  UserDefinedFunction [Helper].[IDCard]    脚本日期: 12/07/2007 23:21:37 ***** */
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
CREATE   FUNCTION   [ Helper ] . [ IDCard ]  
(
     @Card      varchar ( 18 )
)
RETURNS  
@TCard   TABLE  
(
     Input     varchar ( 18 )
    ,IDCard     varchar ( 18 )
    ,Valid     bit
)
AS
BEGIN
     DECLARE     
              @Input          as   varchar ( 18 )
            , @IDCard      as   varchar ( 18 )
            , @Valid          as   bit

DECLARE      
              @Length      as   smallint
            , @TmpCard      as   varchar ( 18 )
            , @IsOld          as   bit

SET   @Valid   =   0
     SET   @IDCard   =   ''
     SET   @Input   =   ''

IF   @Card   IS   NULL   GOTO  Finish

SET   @Input   =   LTRIM ( RTRIM ( @Card ))  /* 去空格 */
     SET   @Length   =   LEN ( @Input )

IF   NOT   @Length   IN  ( 15 ,  18 )  GOTO  Finish  /* 非15、18位 */

IF   @Length   =   15
         BEGIN
             IF   ISNUMERIC ( @Input )  =   0   GOTO  Finish  /* 非数字 */
             SET   @TmpCard   =   LEFT ( @Input ,  6 )  +   ' 19 '   +   RIGHT ( @input ,  9 )  /* 补充为17位 */
             SET   @IsOld   =   1
         END
     ELSE
         BEGIN
             IF   ISNUMERIC ( LEFT ( @Input ,  17 ))  =   0   GOTO  Finish  /* 非数字 */
             SET   @TmpCard   =   LEFT ( @Input ,  17 )  /* 取前17位 */
             SET   @IsOld   =   0
         END

DECLARE   @Birthday      varchar ( 8 )
     SET   @Birthday   =   SUBSTRING ( @TmpCard ,  7 ,  8 )
     IF   ISDATE ( @birthday )  =   0   GOTO  Finish  /* 非日期 */

-- 前17位数与相应加权因子的积的和
     DECLARE  
              @Sum   as   smallint
            , @WI   as   tinyint
            , @Index   as   tinyint
            , @Num   as   tinyint

SET   @Sum   =   0
     SET   @Index   =   1

WHILE   @Index   <   18
         BEGIN
             SET   @Num   =   CAST ( SUBSTRING ( @TmpCard ,  @Index ,  1 )  AS   tinyint )

SELECT   @WI   =
                 CASE   @Index
                     WHEN   1   THEN   7
                     WHEN   2   THEN   9
                     WHEN   3   THEN   10
                     WHEN   4   THEN   5
                     WHEN   5   THEN   8
                     WHEN   6   THEN   4
                     WHEN   7   THEN   2
                     WHEN   8   THEN   1
                     WHEN   9   THEN   6
                     WHEN   10   THEN   3
                     WHEN   11   THEN   7
                     WHEN   12   THEN   9
                     WHEN   13   THEN   10
                     WHEN   14   THEN   5
                     WHEN   15   THEN   8
                     WHEN   16   THEN   4
                     WHEN   17   THEN   2
                 END

SET   @Sum   =   @Sum   +   @Num   *   @WI
             SET   @Index   =   @Index   +   1
         END

-- 模11
     DECLARE   @Mod   as   tinyint
     SET   @Mod   =   @Sum   %   11

-- 校验码
     DECLARE   @Parity   as   varchar ( 1 )
     SELECT   @Parity   =
         CASE   @Mod
             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 '
         END

-- 完整的18位身份证号码
     SET   @TmpCard   =   @TmpCard   +   @Parity

IF   @IsOld   =   1
         SET   @Valid   =   1
     ELSE  
         IF   @Parity   =   RIGHT ( @Input ,  1 )  /* 校验 */
             SET   @Valid   =   1

-- 无论正确与否,都给出有效身份证号码
     SET   @IDCard   =   @tmpCard

Finish:
     INSERT   INTO   @TCard   VALUES ( @Input ,  @IDCard ,  @Valid )    
     RETURN  
END

使用用下列语句,可以列出所有不符的身份证号码.

SELECT
      [ 姓名 ]
    , [ 身份证号 ]
    ,b. *
FROM   [ EmployeeWorks ] . [ Base ] . [ 职员 ]  
CROSS  APPLY  [ LzmTWWorks ] . [ Helper ] . [ IDCard ] (身份证号) b
WHERE   NOT   [ 身份证号 ]   IS   NULL   AND  Valid  =   0

20071217 补充一些信息

USE   [ LzmTWWorks ]
GO
set  ANSI_NULLS  ON
set  QUOTED_IDENTIFIER  ON
GO
ALTER   FUNCTION   [ Helper ] . [ IDCard ]  
(
     @Card      varchar ( 18 )
)
RETURNS  
@TCard   TABLE  
(
     Input     varchar ( 18 )
    ,IDCard     varchar ( 18 )
    ,Sex     bit
    ,Birthday  varchar ( 8 )
    ,Region     varchar ( 6 )
    ,RegionName  nvarchar ( 50 )
    ,RegionFullName  nvarchar ( 100 )
    ,Valid     bit
)
AS
BEGIN
     DECLARE     
              @Input          varchar ( 18 )
            , @IDCard      varchar ( 18 )
            , @Sex          bit
            , @Birthday      varchar ( 8 )
            , @Region      varchar ( 6 )
            , @RegionName   varchar ( 50 )
            , @RegionFullName   varchar ( 100 )
            , @Valid          bit

DECLARE      
              @Length      as   smallint
            , @TmpCard      as   varchar ( 18 )
            , @IsOld          as   bit

SET   @Valid   =   0
     SET   @IDCard   =   ''
     SET   @Input   =   ''

IF   @Card   IS   NULL   GOTO  Finish

SET   @Input   =   LTRIM ( RTRIM ( @Card ))  /* 去空格 */
     SET   @Length   =   LEN ( @Input )

IF   NOT   @Length   IN  ( 15 ,  18 )  GOTO  Finish  /* 非15、18位 */

IF   @Length   =   15
         BEGIN
             IF   ISNUMERIC ( @Input )  =   0   GOTO  Finish  /* 非数字 */
             SET   @TmpCard   =   LEFT ( @Input ,  6 )  +   ' 19 '   +   RIGHT ( @input ,  9 )  /* 补充为17位 */
             SET   @IsOld   =   1
         END
     ELSE
         BEGIN
             IF   ISNUMERIC ( LEFT ( @Input ,  17 ))  =   0   GOTO  Finish  /* 非数字 */
             SET   @TmpCard   =   LEFT ( @Input ,  17 )  /* 取前17位 */
             SET   @IsOld   =   0
         END

SET   @Birthday   =   SUBSTRING ( @TmpCard ,  7 ,  8 )
     IF   ISDATE ( @birthday )  =   0   GOTO  Finish  /* 非日期 */

-- 前17位数与相应加权因子的积的和
     DECLARE  
              @Sum   as   smallint
            , @WI   as   tinyint
            , @Index   as   tinyint
            , @Num   as   tinyint

SET   @Sum   =   0
     SET   @Index   =   1

WHILE   @Index   <   18
         BEGIN
             SET   @Num   =   CAST ( SUBSTRING ( @TmpCard ,  @Index ,  1 )  AS   tinyint )

SELECT   @WI   =
                 CASE   @Index
                     WHEN   1   THEN   7
                     WHEN   2   THEN   9
                     WHEN   3   THEN   10
                     WHEN   4   THEN   5
                     WHEN   5   THEN   8
                     WHEN   6   THEN   4
                     WHEN   7   THEN   2
                     WHEN   8   THEN   1
                     WHEN   9   THEN   6
                     WHEN   10   THEN   3
                     WHEN   11   THEN   7
                     WHEN   12   THEN   9
                     WHEN   13   THEN   10
                     WHEN   14   THEN   5
                     WHEN   15   THEN   8
                     WHEN   16   THEN   4
                     WHEN   17   THEN   2
                 END

SET   @Sum   =   @Sum   +   @Num   *   @WI
             SET   @Index   =   @Index   +   1
         END

-- 模11
     DECLARE   @Mod   as   tinyint
     SET   @Mod   =   @Sum   %   11

-- 校验码
     DECLARE   @Parity   as   varchar ( 1 )
     SELECT   @Parity   =
         CASE   @Mod
             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 '
         END

-- 完整的18位身份证号码
     SET   @TmpCard   =   @TmpCard   +   @Parity

IF   @IsOld   =   1
         SET   @Valid   =   1
     ELSE  
         IF   @Parity   =   RIGHT ( @Input ,  1 )  /* 校验 */
             SET   @Valid   =   1

-- 无论正确与否,都给出有效身份证号码
     SET   @IDCard   =   @tmpCard

-- 取其它信息
     SET   @Sex   =   SUBSTRING ( @tmpCard ,  17 ,  1 )  %   2

SET   @Region   =   SUBSTRING ( @tmpCard ,  1 ,  6 )

SELECT  
          @RegionName   =   [ Name ]
        , @RegionFullName   =   [ Full ]
     FROM   [ Helper ] . [ RegionCodeFullName ] ( Default ,  @Region )  /* 从最新版本数据中取区域信息 */

IF   @RegionName   IS   NULL
     BEGIN
         DECLARE   @FirstDate   varchar ( 8 )  /* 第一代身份证的区划码,有许多现在已经不用了。为此,要从最旧版本数据中取区域信息 */

SELECT   @FirstDate   =   MIN (FirstDate) 
         FROM   [ Private ] . [ RegionCode ]     
    
         SELECT  
              @RegionName   =   [ Name ]
            , @RegionFullName   =   [ Full ]
         FROM   [ Helper ] . [ RegionCodeFullName ] (
              @FirstDate
            , @Region )    
     END

Finish:
     INSERT   INTO   @TCard  
     VALUES ( 
          @Input
        , @IDCard
        , @Sex
        , @Birthday
        , @Region
        , @RegionName
        , @RegionFullName
        , @Valid )    
     RETURN  
END

示例:

SELECT   *   FROM   [ LzmTWWorks ] . [ Helper ] . [ IDCard ]  ( ' 110116200808080010 ' )

/*
Input              IDCard             Sex   Birthday Region RegionName   RegionFullName    Valid
------------------ ------------------ ----- -------- ------ ------------ -------------- -----
110116200808080010 110116200808080014 1     20080808 110116 怀柔区       北京市怀柔区    0

*/

SQLServer2005 身份证函数,含验证和15位转18位相关推荐

  1. javascript 15位和18位身份证的正则表达式及其验证

    1.简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) (2)preg_match(& ...

  2. JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别

    我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...

  3. 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)

    window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...

  4. Greenplum函数 - 身份证号15位转18位

    前几天一直有人在问,如何在Greenplum里面实现身份证号15位到18位的转换函数,今天网上搜了一下,看了看大概的逻辑,做了个简单实现,转换逻辑不懂的,请自行百度吧,这里放出函数内容,供大家使用: ...

  5. 简单的关于身份证(15位或者18位)合法性验证

    简单的关于身份证(15位或者18位)合法性验证 package com.clark.test.idcard;/*** 测试校验身份证合法性的小程序* <p>我们常用的身份证号码为18位或者 ...

  6. 【转载】 身份证号码校验(15位和18位都可以)

    转载自: 开源中国社区    面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...

  7. Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)

    项目场景: 提示:这次做项目的时候遇到一个工具,整理出来以后可以直接使用 问题描述:给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 身份证号码分为 15 位 和18 ...

  8. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  9. js 身份证精确校验(支持15位和18位身份证号 )

    js 校验方法 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCode(code){var city={11:&qu ...

最新文章

  1. sqlalchemy Specified key was too long; max key length is 767 bytes的解决办法
  2. Mac中word插入图片保持原来的清晰度
  3. 长文总结半监督学习(Semi-Supervised Learning)
  4. pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17
  5. 将非事务性资源绑定到JTA事务中的几种模式
  6. 数据结构与算法-常见时间复杂度
  7. python中set集合_Python中的SET集合操作
  8. Python3之Memcache使用
  9. java转pdf_Java转PDF(基础)
  10. matlab异步电动机转速,转速闭环恒压频比异步电机调速系统 MatlabSimulink 仿真.pdf...
  11. 电子电路设计——multisum中快捷设置555定时器
  12. (第九章)UI--PS 基础 通道抠图
  13. 项目管理第四章项目整合管理
  14. error: expected unqualified-id before 'xxx'
  15. php中$this-是什么意思?
  16. 【转载】不用加号和减号计算两个数的加法
  17. 阿里架构师的炫技与克制:代码的两种味道与态度
  18. 2款免费的安卓后台游戏
  19. JAVA多线程使用场景和注意事项
  20. 机器学习对数学的要求_是对您的机器学习模因进行数学调查

热门文章

  1. 利用百度地图api显示北京某区电影院
  2. 使用多种格式转换方法将MKV转成GIF
  3. 【笔记】2022.5.5 正则表达式
  4. 机器人改变生活利弊英语作文_最新雅思写作语料库:机器人利弊
  5. 进一步了解系统I/O
  6. 使用xml模板生成word文档
  7. 2020年中级数据库系统工程师考试笔记14—标准化和知识产权基础知识
  8. 有没有好的RFID仓库管理解决方案?RFID仓库管理系统就在新导智能
  9. Django连接数据库创建表字段的解释
  10. Linux环境下邮件主题、发件人中文乱码解决