SQL Server 验证身份证号码准确性
来源:互联网 发布:大数据 分析考研 编辑:程序博客网 时间:2024/04/28 20:30
/*******************************************************************
函数名称:IsvalidIDCard()
参数:@IDCardNo string 身份证号码
返回值: bit 是否有效
功能描述:判断身份证号码是否合法
备注:目前中国的身份证号码有18位和15位.
1,18位身份证号码的组成:6位地区编码+8位出生年月日+3位编号(奇男偶女)+1位校验码
2,15位身份证号码的组成:6位地区编码+6位出生年月日+3位编号(奇男偶女)
*******************************************************************/
--DROP FUNCTION IsvalidIDCard
CREATE FUNCTION [dbo].[IsvalidIDCard] ( @IDCardNo VARCHAR(50) )
RETURNS BIT
AS
BEGIN
DECLARE @Length INT ,
@Loop INT ,
@Sum INT
DECLARE @SingleChar CHAR
SET @Sum = 0
IF @IDCardNo IS NULL
OR @IDCardNo = NULL
OR LTRIM(RTRIM(@IDCardNo)) = ''
BEGIN
RETURN 0
END
SET @Length = LEN(@IDCardNo)
--判断位数
IF @Length < > 18
AND @Length < > 15
BEGIN
RETURN 0
END
IF @Length = 18
BEGIN
IF ISNUMERIC(LEFT(@IDCardNo, 17)) = 0
BEGIN
RETURN 0
END
IF ISDATE(SUBSTRING(@IDCardNo, 7, 4) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2) + ' - '
+ SUBSTRING(@IDCardNo, 13, 2)) = 0
BEGIN
RETURN 0
END
SET @Loop = 17
WHILE ( @Loop >= 1 )
BEGIN
SET @Sum = @Sum
+ CONVERT(INT, REPLACE(SUBSTRING(@IDCardNo, @Loop,
1), '.', ''))
* ( POWER(2, ( 18 - @Loop )) % 11 )
SET @Loop = @Loop - 1
END
SET @Loop = @Sum % 11
IF @Loop = 0
BEGIN
SET @SingleChar = '1'
END
ELSE
IF @Loop = 1
BEGIN
SET @SingleChar = '0'
END
ELSE
IF @Loop = 2
BEGIN
SET @SingleChar = 'X'
END
ELSE
BEGIN
SET @SingleChar = CONVERT(VARCHAR(2), ( 12
- @Loop ))
END
IF LOWER(RIGHT(@IDCardNo, 1)) < > LOWER(@SingleChar)
BEGIN
RETURN 0
END
END
ELSE
IF @Length = 15
BEGIN
IF ISNUMERIC(@IDCardNo) = 0
BEGIN
RETURN 0
END
IF ISDATE('19' + SUBSTRING(@IDCardNo, 7, 2) + ' - '
+ SUBSTRING(@IDCardNo, 9, 2) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2)) = 0
BEGIN
RETURN 0
END
END
RETURN 1
函数名称:IsvalidIDCard()
参数:@IDCardNo string 身份证号码
返回值: bit 是否有效
功能描述:判断身份证号码是否合法
备注:目前中国的身份证号码有18位和15位.
1,18位身份证号码的组成:6位地区编码+8位出生年月日+3位编号(奇男偶女)+1位校验码
2,15位身份证号码的组成:6位地区编码+6位出生年月日+3位编号(奇男偶女)
*******************************************************************/
--DROP FUNCTION IsvalidIDCard
CREATE FUNCTION [dbo].[IsvalidIDCard] ( @IDCardNo VARCHAR(50) )
RETURNS BIT
AS
BEGIN
DECLARE @Length INT ,
@Loop INT ,
@Sum INT
DECLARE @SingleChar CHAR
SET @Sum = 0
IF @IDCardNo IS NULL
OR @IDCardNo = NULL
OR LTRIM(RTRIM(@IDCardNo)) = ''
BEGIN
RETURN 0
END
SET @Length = LEN(@IDCardNo)
--判断位数
IF @Length < > 18
AND @Length < > 15
BEGIN
RETURN 0
END
IF @Length = 18
BEGIN
IF ISNUMERIC(LEFT(@IDCardNo, 17)) = 0
BEGIN
RETURN 0
END
IF ISDATE(SUBSTRING(@IDCardNo, 7, 4) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2) + ' - '
+ SUBSTRING(@IDCardNo, 13, 2)) = 0
BEGIN
RETURN 0
END
SET @Loop = 17
WHILE ( @Loop >= 1 )
BEGIN
SET @Sum = @Sum
+ CONVERT(INT, REPLACE(SUBSTRING(@IDCardNo, @Loop,
1), '.', ''))
* ( POWER(2, ( 18 - @Loop )) % 11 )
SET @Loop = @Loop - 1
END
SET @Loop = @Sum % 11
IF @Loop = 0
BEGIN
SET @SingleChar = '1'
END
ELSE
IF @Loop = 1
BEGIN
SET @SingleChar = '0'
END
ELSE
IF @Loop = 2
BEGIN
SET @SingleChar = 'X'
END
ELSE
BEGIN
SET @SingleChar = CONVERT(VARCHAR(2), ( 12
- @Loop ))
END
IF LOWER(RIGHT(@IDCardNo, 1)) < > LOWER(@SingleChar)
BEGIN
RETURN 0
END
END
ELSE
IF @Length = 15
BEGIN
IF ISNUMERIC(@IDCardNo) = 0
BEGIN
RETURN 0
END
IF ISDATE('19' + SUBSTRING(@IDCardNo, 7, 2) + ' - '
+ SUBSTRING(@IDCardNo, 9, 2) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2)) = 0
BEGIN
RETURN 0
END
END
RETURN 1
END
调用方法:
SELECT COUNT(*)
FROM dbo.UserInfo_Index
WHERE dbo.IsvalidIDCard(pid) = 0
阅读全文
0 0
- SQL Server 验证身份证号码准确性
- sql server 验证身份证号码有效性
- SQL简单验证身份证号码位数、出生日期、性别
- SQL函数验证身份证号码是否有效
- 验证身份证号码
- 身份证号码验证
- 验证身份证号码
- 身份证号码验证
- 验证身份证号码
- 身份证号码验证
- 验证身份证号码
- 身份证号码验证
- 身份证号码验证
- 验证身份证号码
- 身份证号码验证
- 身份证号码验证 !
- 验证身份证号码
- 验证身份证号码
- python基础之模块之os模块
- bnuoj1027 金币系统
- 二极管工作原理
- Java 换行 \n 与 System.getProperty("line.separator");
- 杭电 1546 Idiomatic Phrases Game 最短路 Dijstra
- SQL Server 验证身份证号码准确性
- Nginx+FastCGI编译部署过程详述
- 计算机视觉概述(待续...)
- PAT甲级1001
- 贪心专题 HDU 2111
- 字符串列表按字符长度排序
- yum命令集合
- Unity 3D 博客汇总
- 在 Linux 下使用 RAID(六):设置 RAID 10 或 1 + 0(嵌套)