SQLServer2005 身份证函数,含验证和15位转18位
Author:水如烟
SQLServer2005 身份证函数,含验证和15位转18位
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
使用用下列语句,可以列出所有不符的身份证号码.
[ 姓名 ]
, [ 身份证号 ]
,b. *
FROM [ EmployeeWorks ] . [ Base ] . [ 职员 ]
CROSS APPLY [ LzmTWWorks ] . [ Helper ] . [ IDCard ] (身份证号) b
WHERE NOT [ 身份证号 ] IS NULL AND Valid = 0
20071217 补充一些信息
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
示例:
/*
Input IDCard Sex Birthday Region RegionName RegionFullName Valid
------------------ ------------------ ----- -------- ------ ------------ -------------- -----
110116200808080010 110116200808080014 1 20080808 110116 怀柔区 北京市怀柔区 0
*/
SQLServer2005 身份证函数,含验证和15位转18位相关推荐
- javascript 15位和18位身份证的正则表达式及其验证
1.简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) (2)preg_match(& ...
- JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别
我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...
- 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)
window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...
- Greenplum函数 - 身份证号15位转18位
前几天一直有人在问,如何在Greenplum里面实现身份证号15位到18位的转换函数,今天网上搜了一下,看了看大概的逻辑,做了个简单实现,转换逻辑不懂的,请自行百度吧,这里放出函数内容,供大家使用: ...
- 简单的关于身份证(15位或者18位)合法性验证
简单的关于身份证(15位或者18位)合法性验证 package com.clark.test.idcard;/*** 测试校验身份证合法性的小程序* <p>我们常用的身份证号码为18位或者 ...
- 【转载】 身份证号码校验(15位和18位都可以)
转载自: 开源中国社区 面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...
- Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)
项目场景: 提示:这次做项目的时候遇到一个工具,整理出来以后可以直接使用 问题描述:给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 身份证号码分为 15 位 和18 ...
- 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...
- js 身份证精确校验(支持15位和18位身份证号 )
js 校验方法 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCode(code){var city={11:&qu ...
最新文章
- sqlalchemy Specified key was too long; max key length is 767 bytes的解决办法
- Mac中word插入图片保持原来的清晰度
- 长文总结半监督学习(Semi-Supervised Learning)
- pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17
- 将非事务性资源绑定到JTA事务中的几种模式
- 数据结构与算法-常见时间复杂度
- python中set集合_Python中的SET集合操作
- Python3之Memcache使用
- java转pdf_Java转PDF(基础)
- matlab异步电动机转速,转速闭环恒压频比异步电机调速系统 MatlabSimulink 仿真.pdf...
- 电子电路设计——multisum中快捷设置555定时器
- (第九章)UI--PS 基础 通道抠图
- 项目管理第四章项目整合管理
- error: expected unqualified-id before 'xxx'
- php中$this-是什么意思?
- 【转载】不用加号和减号计算两个数的加法
- 阿里架构师的炫技与克制:代码的两种味道与态度
- 2款免费的安卓后台游戏
- JAVA多线程使用场景和注意事项
- 机器学习对数学的要求_是对您的机器学习模因进行数学调查