SqlServer2000身份证合法校验函数的实现方法
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要讲解了SqlServer2000身份证合法校验函数的实现方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。下面看下sqlserver2000身份证校验的代码,
千家信息网最后更新 2025年11月08日SqlServer2000身份证合法校验函数的实现方法
这篇文章主要讲解了SqlServer2000身份证合法校验函数的实现方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
下面看下sqlserver2000身份证校验的代码,具体代码如下所示:
/*身份校验行数*/if exists(select * from sysobjects where name='fun_utils_idnumberoprater' and type='FN') drop function fun_utils_idnumberopratergocreate function fun_utils_idnumberoprater(@idnumber varchar(50)='') returns varchar(500)as/*公民身份号码是由17位数字码和1位校验码组成。排列顺序从左至右分别为:6位地址码,8位出生日期码,3位顺序码和1位校验码。地址码(身份证地址码对照表见下面附录)和出生日期码很好理解,顺序码表示在同一地址码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。身份证最后一位校验码算法如下:1. 将身份证号码前17位数分别乘以不同的系数,从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 22. 将得到的17个乘积相加。3. 将相加后的和除以11并得到余数。4. 余数可能为0 1 2 3 4 5 6 7 8 9 10这些个数字,其对应的身份证最后一位校验码为1 0 X 9 8 7 6 5 4 3 2。function: 1.校验身份证有效性 2.15位身份证转18位*/begin declare @ReturnText varchar(1000) --返回值 ,@Separator varchar(1) --分隔符 ,@idnumberElement varchar(1) --身份证每位元素 ,@CurrentIndex int --身份证号当前索引位 ,@NextIndex int --身份证号下一个索引位 ,@xsnumber varchar(50) --系数 ,@xsElement varchar(2) --系数每位元素 ,@xsCurrentIndex int --系数当前索引位 ,@xsNextIndex int --系数下一个索引位 ,@jym varchar(11) --校验码 ,@sum int --身份证元素*系数求和 ,@div int --合计对11求余数 ,@CurrentJym varchar(1) --当前校验码 ,@CurrentWs int --当前身份证位数 ,@NewJym varchar(1000) --新校验码 ,@NewWs int --新身份证位数 ,@oldId varchar(20) --处理身份证号并校验位数有效性 set @Separator =','; set @CurrentIndex = 1; set @xsnumber = '7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2'; set @xsCurrentIndex = 1; set @jym = '10X98765432'; set @sum = 0; set @CurrentWs = 0; set @CurrentJym = ''; set @NewJym = ''; set @NewWs = 0; set @CurrentWs=len(@idnumber); set @oldId = @idnumber; if @CurrentWs=15 begin set @idnumber=stuff(@idnumber,7,0,case when substring(@idnumber,13,3) in ('999','998','997','996') then '18' else '19' end); SET @CurrentJym = ''; end else if @CurrentWs>=18 begin set @CurrentJym=substring(@idnumber,18,1); set @idnumber=substring(@idnumber,1,17); end else begin set @ReturnText='校验失败_' goto TheEnd; end if isdate(substring(@idnumber,7,8))=0 begin set @ReturnText='校验失败_' goto TheEnd; end --计算身份证校验位 while(@CurrentIndex<=len(@idnumber)) begin set @NextIndex=@CurrentIndex+1; set @xsNextIndex=charindex(@Separator,@xsnumber,@xsCurrentIndex); if(@xsNextIndex=0 OR @xsNextIndex IS NULL) set @xsNextIndex=len(@xsnumber)+1; set @idnumberElement=substring(@idnumber,@CurrentIndex,@NextIndex-@CurrentIndex); set @xsElement=substring(@xsnumber,@xsCurrentIndex,@xsNextIndex-@xsCurrentIndex); if ISNUMERIC(@idnumberElement) > 0 set @sum=@sum+cast(@idnumberElement as int)*cast(@xsElement as int) else begin set @ReturnText='校验失败_'; goto TheEnd end set @CurrentIndex=@CurrentIndex+1; set @xsCurrentIndex=@xsNextIndex+1; end set @div=@sum; set @NewJym=substring(@jym,@div+1,1); --校验身份证校验位是否出错 if (@CurrentJym<>'') and (@NewJym<>@CurrentJym) begin set @ReturnText='校验失败_'; goto TheEnd end --输出新的身份证号 if len(@oldId) > 18 set @ReturnText='校验通过,原始身份证长度非15位或18位_'+(@idnumber+@NewJym) else set @ReturnText='校验通过,原始身份证长度为'+cast(len(@oldId) as varchar)+'位_'+(@idnumber+@NewJym) goto TheEnd TheEnd: return @ReturnTextendgo-- ----------------------以下存储过程是遍历整个表,添加字段并修改校验------------------------/** 一下存储过程是在原表的基础上,添加字段保存校验结果,需要替换掉表明和字段名*/-- 表名:a_idcard , 列 idcard 原身份证, card 标准(新添加),result校验结果(新添加)-- 添加标准身份证字段beginbeginif not exists (select * from syscolumns where id=object_id('a_idcard') and name='card') alter table a_idcard add [card] varchar(20);end-- 添加校验结果字段beginif not exists (select * from syscolumns where id=object_id('a_idcard') and name='result') alter table a_idcard add [result] nvarchar(20);endendgo--遍历结果BEGINdeclare @id_card varchar(100), @res varchar(200),@c_index intdeclare cur cursor for select idcard from a_idcard -- 这里需要替换open curfetch next from cur into @id_cardwhile @@FETCH_STATUS = 0 begin set @res = dbo.fun_utils_idnumberoprater(@id_card)set @c_index = charindex('_',@res)print substring(@res,0,@c_index)print substring(@res, @c_index+1, len(@res))-- 这里需要替换update a_idcard set card=substring(@res, @c_index+1, len(@res)),result=substring(@res,0,@c_index)where idcard=@id_cardfetch next from cur into @id_cardend close curdeallocate curend goPS:下面看下身份证合法性校验模板
//这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。 //如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。 function isIdCardNo(num) { if(num.indexOf("x")!=-1){ return false; } num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) { alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'); return false; } //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 //下面分别分析出生日期和校验位 var len, re; len = num.length; if (len == 15) { re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert('输入的身份证号里出生日期不对!'); return false; } else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); for (i = 0; i < 17; i++) { nTemp += num.substr(i, 1) * arrInt[i]; } num += arrCh[nTemp % 11]; return num; } } if (len == 18) { re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert(dtmBirth.getYear()); alert(arrSplit[2]); alert('输入的身份证号里出生日期不对!'); return false; } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var valnum; var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; for (i = 0; i < 17; i++) { nTemp += num.substr(i, 1) * arrInt[i]; } valnum = arrCh[nTemp % 11]; if (valnum != num.substr(17, 1)) { alert('18位身份证的校验码不正确!应该为:' + valnum); return false; } return num; } } return false;}看完上述内容,是不是对SqlServer2000身份证合法校验函数的实现方法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。
身份
身份证
数字
日期
系数
证号
号码
位数
字段
顺序
合法
地址
索引
结果
不对
余数
元素
内容
生日
长度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
阿里云服务器宝塔搭建教程
数据库中最常见的三种关系运算
防ddos服务器设备
南航软件开发工资
王者服务器为啥还没更新
带你一图读懂网络安全法
汽车网络安全相关的问题
远程服务器能查询谁登陆过吗
腾讯微云下载老是服务器错误
网站开发和软件开发那个简单
labview数据库转数组
编辑器网站软件开发
长沙棋牌软件开发胡林
立方体拼图软件开发
软件开发俗语叫什么
sap服务器标准
中兴服务器怎么用kvm安装系统
服务器测试工程师有哪些证可以考
北京源线达网络技术中心
保定网络技术联系方式
二维码网络安全作品
浙江民主评议软件开发电话
当今计算机网络技术的发展
四级数据库技术考哪几门
携程的数据库
软件开发工程师30之后
碳网络技术
支持跳表的数据库
oecd数据库有外文吗
软件开发工程师所需知识