国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SqlServer2000+ 身份證合法校驗(yàn)函數(shù)的示例代碼

2020-07-25 11:51:45
字體:
供稿:網(wǎng)友

下面看下sqlserver2000身份證校驗(yàn)的代碼,具體代碼如下所示:

/*身份校驗(yàn)行數(shù)*/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位數(shù)字碼和1位校驗(yàn)碼組成。排列順序從左至右分別為:6位地址碼,8位出生日期碼,3位順序碼和1位校驗(yàn)碼。地址碼(身份證地址碼對照表見下面附錄)和出生日期碼很好理解,順序碼表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年同月同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。身份證最后一位校驗(yàn)碼算法如下:1. 將身份證號碼前17位數(shù)分別乘以不同的系數(shù),從第1位到第17位的系數(shù)分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 22. 將得到的17個乘積相加。3. 將相加后的和除以11并得到余數(shù)。4. 余數(shù)可能為0 1 2 3 4 5 6 7 8 9 10這些個數(shù)字,其對應(yīng)的身份證最后一位校驗(yàn)碼為1 0 X 9 8 7 6 5 4 3 2。function:	1.校驗(yàn)身份證有效性	2.15位身份證轉(zhuǎn)18位*/begin	declare @ReturnText varchar(1000) --返回值			,@Separator varchar(1) --分隔符						,@idnumberElement varchar(1) --身份證每位元素			,@CurrentIndex int --身份證號當(dāng)前索引位			,@NextIndex int --身份證號下一個索引位						,@xsnumber varchar(50) --系數(shù)			,@xsElement varchar(2) --系數(shù)每位元素			,@xsCurrentIndex int --系數(shù)當(dāng)前索引位			,@xsNextIndex int --系數(shù)下一個索引位						,@jym varchar(11) --校驗(yàn)碼			,@sum int --身份證元素*系數(shù)求和			,@div int --合計(jì)對11求余數(shù)						,@CurrentJym varchar(1) --當(dāng)前校驗(yàn)碼			,@CurrentWs int --當(dāng)前身份證位數(shù)			,@NewJym varchar(1000) --新校驗(yàn)碼			,@NewWs int --新身份證位數(shù)			,@oldId varchar(20)	--處理身份證號并校驗(yàn)位數(shù)有效性	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='校驗(yàn)失敗_'		goto TheEnd;	end	if isdate(substring(@idnumber,7,8))=0 	begin		set @ReturnText='校驗(yàn)失敗_'		goto TheEnd;	end	--計(jì)算身份證校驗(yàn)位	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='校驗(yàn)失敗_';				goto TheEnd			end			set @CurrentIndex=@CurrentIndex+1;		set @xsCurrentIndex=@xsNextIndex+1;			end		set @div=@sum%11;	set @NewJym=substring(@jym,@div+1,1);	--校驗(yàn)身份證校驗(yàn)位是否出錯	if (@CurrentJym<>'') and (@NewJym<>@CurrentJym)	begin		set @ReturnText='校驗(yàn)失敗_';		goto TheEnd	end	--輸出新的身份證號	if len(@oldId) > 18		set @ReturnText='校驗(yàn)通過,原始身份證長度非15位或18位_'+(@idnumber+@NewJym)	else		set @ReturnText='校驗(yàn)通過,原始身份證長度為'+cast(len(@oldId) as varchar)+'位_'+(@idnumber+@NewJym)	goto TheEnd	TheEnd:	return @ReturnTextendgo-- ----------------------以下存儲過程是遍歷整個表,添加字段并修改校驗(yàn)------------------------/** 一下存儲過程是在原表的基礎(chǔ)上,添加字段保存校驗(yàn)結(jié)果,需要替換掉表明和字段名*/-- 表名:a_idcard , 列 idcard 原身份證, card 標(biāo)準(zhǔn)(新添加),result校驗(yàn)結(jié)果(新添加)-- 添加標(biāo)準(zhǔn)身份證字段beginbeginif not exists (select * from syscolumns where id=object_id('a_idcard') and name='card') 		alter table a_idcard add [card] varchar(20);end-- 添加校驗(yàn)結(jié)果字段beginif not exists (select * from syscolumns where id=object_id('a_idcard') and name='result') alter table a_idcard add [result] nvarchar(20);endendgo--遍歷結(jié)果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 go

PS:下面看下身份證合法性校驗(yàn)?zāi)0?/strong>

//這個可以驗(yàn)證15位和18位的身份證,并且包含生日和校驗(yàn)位的驗(yàn)證。 //如果有興趣,還可以加上身份證所在地的驗(yàn)證,就是前6位有些數(shù)字合法有些數(shù)字不合法。 function isIdCardNo(num) {  if(num.indexOf("x")!=-1){   return false;  } num = num.toUpperCase(); //身份證號碼為15位或者18位,15位時全為數(shù)字,18位前17位為數(shù)字,最后一位是校驗(yàn)位,可能為數(shù)字或字符X。    if (!(/(^/d{15}$)|(^/d{17}([0-9]|X)$)/.test(num))) {  alert('輸入的身份證號長度不對,或者號碼不符合規(guī)定!/n15位號碼應(yīng)全為數(shù)字,18位號碼末位可以為數(shù)字或X。');  return false; } //校驗(yàn)位按照ISO 7064:1983.MOD 11-2的規(guī)定生成,X可以認(rèn)為是數(shù)字10。 //下面分別分析出生日期和校驗(yàn)位 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位身份證轉(zhuǎn)成18位   //校驗(yàn)位按照ISO 7064:1983.MOD 11-2的規(guī)定生成,X可以認(rèn)為是數(shù)字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 {   //檢驗(yàn)18位身份證的校驗(yàn)碼是否正確。   //校驗(yàn)位按照ISO 7064:1983.MOD 11-2的規(guī)定生成,X可以認(rèn)為是數(shù)字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位身份證的校驗(yàn)碼不正確!應(yīng)該為:' + valnum);    return false;   }   return num;  } } return false;}

總結(jié)

到此這篇關(guān)于SqlServer2000+ 身份證合法校驗(yàn)函數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)sqlserver2000身份證校驗(yàn)內(nèi)容請搜索武林網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 六安市| 四平市| 松潘县| 周至县| 德保县| 金塔县| 封开县| 松原市| 乳山市| 惠来县| 广河县| 石狮市| 察雅县| 游戏| 彩票| 什邡市| 广宗县| 确山县| 霸州市| 宜君县| 家居| 灌南县| 永胜县| 融水| 肥西县| 邵武市| 天柱县| 卓资县| 县级市| 潼南县| 建瓯市| 怀柔区| 宣武区| 柯坪县| 若尔盖县| 剑阁县| 三穗县| 乌苏市| 图木舒克市| 常山县| 巴林左旗|