下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當前位置:軟件下載吧 > 數(shù)據(jù)庫 > MS_SQL > SQL開發(fā)知識:SqlServer2000+ 身份證合法校驗函數(shù)的示例代碼

          SQL開發(fā)知識:SqlServer2000+ 身份證合法校驗函數(shù)的示例代碼

          時間:2024-03-10 11:43作者:下載吧人氣:23

          下面看下sqlserver2000身份證校驗的代碼,具體代碼如下所示:

          /*
          身份校驗行數(shù)
          */
          if exists(select * from sysobjects where name=’fun_utils_idnumberoprater’ and type=’FN’)
          drop function fun_utils_idnumberoprater
          go
          create function fun_utils_idnumberoprater
          (
          @idnumber varchar(50)=”
          )
          returns varchar(500)
          as
          /*
          公民身份號碼是由17位數(shù)字碼和1位校驗碼組成。排列順序從左至右分別為:6位地址碼,8位出生日期碼,3位順序碼和1位校驗碼。
          地址碼(身份證地址碼對照表見下面附錄)和出生日期碼很好理解,順序碼表示在同一地址碼所標識的區(qū)域范圍內(nèi),對同年同月同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
          身份證最后一位校驗碼算法如下:
          1. 將身份證號碼前17位數(shù)分別乘以不同的系數(shù),從第1位到第17位的系數(shù)分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
          2. 將得到的17個乘積相加。
          3. 將相加后的和除以11并得到余數(shù)。
          4. 余數(shù)可能為0 1 2 3 4 5 6 7 8 9 10這些個數(shù)字,其對應的身份證最后一位校驗碼為1 0 X 9 8 7 6 5 4 3 2。
          function:
          1.校驗身份證有效性
          2.15位身份證轉(zhuǎn)18位
          */
          begin

          declare @ReturnText varchar(1000) –返回值
          ,@Separator varchar(1) –分隔符

          ,@idnumberElement varchar(1) –身份證每位元素
          ,@CurrentIndex int –身份證號當前索引位
          ,@NextIndex int –身份證號下一個索引位

          ,@xsnumber varchar(50) –系數(shù)
          ,@xsElement varchar(2) –系數(shù)每位元素
          ,@xsCurrentIndex int –系數(shù)當前索引位
          ,@xsNextIndex int –系數(shù)下一個索引位

          ,@jym varchar(11) –校驗碼
          ,@sum int –身份證元素*系數(shù)求和
          ,@div int –合計對11求余數(shù)

          ,@CurrentJym varchar(1) –當前校驗碼
          ,@CurrentWs int –當前身份證位數(shù)
          ,@NewJym varchar(1000) –新校驗碼
          ,@NewWs int –新身份證位數(shù)
          ,@oldId varchar(20)

          –處理身份證號并校驗位數(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=’校驗失敗_’
          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%11;
          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 @ReturnText
          end
          go

          — ———————-以下存儲過程是遍歷整個表,添加字段并修改校驗————————

          /*
          * 一下存儲過程是在原表的基礎(chǔ)上,添加字段保存校驗結(jié)果,需要替換掉表明和字段名
          */
          — 表名:a_idcard , 列 idcard 原身份證, card 標準(新添加),result校驗結(jié)果(新添加)

          — 添加標準身份證字段
          begin
          begin
          if not exists (select * from syscolumns where id=object_id(‘a_idcard’) and name=’card’)
          alter table a_idcard add [card] varchar(20);
          end
          — 添加校驗結(jié)果字段
          begin
          if not exists (select * from syscolumns where id=object_id(‘a_idcard’) and name=’result’)
          alter table a_idcard add [result] nvarchar(20);
          end
          end
          go

          –遍歷結(jié)果
          BEGIN
          declare @id_card varchar(100), @res varchar(200),@c_index int
          declare cur cursor

          for
          select idcard from a_idcard — 這里需要替換

          open cur
          fetch next from cur into @id_card
          while @@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_card

          fetch next from cur into @id_card
          end
          close cur
          deallocate cur
          end
          go

          標簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫,SQLSERVER

          相關(guān)下載

          查看所有評論+

          網(wǎng)友評論

          網(wǎng)友
          您的評論需要經(jīng)過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 国产成人av一区二区三区在线观看| 中文字幕精品一区二区精品| 精品国产福利在线观看一区| 亚洲AV成人一区二区三区观看| 一本一道波多野结衣AV一区| 免费高清av一区二区三区| 精品一区二区三区在线观看l | 国产在线精品一区二区三区直播| 亚洲中文字幕无码一区二区三区| 亚洲国产精品一区| 成人区人妻精品一区二区三区| 国产乱码精品一区三上| 国产在线精品一区二区夜色| 人妻无码久久一区二区三区免费 | 久久久无码精品国产一区| 无码精品人妻一区二区三区人妻斩 | 内射一区二区精品视频在线观看| 亚洲一区二区三区在线视频| 国精品无码一区二区三区在线| 人妻AV中文字幕一区二区三区| 国产精品无码一区二区三区不卡 | 国产精品一区12p| 精品一区二区三区自拍图片区| 国产成人一区二区三区| 中文国产成人精品久久一区| 日韩在线一区二区| 精品国产免费一区二区三区| 国产AV一区二区三区传媒| 欧洲精品免费一区二区三区| 国产精品无码一区二区三区电影| 蜜臀AV无码一区二区三区| 国产在线不卡一区二区三区| 相泽南亚洲一区二区在线播放| 国偷自产一区二区免费视频| 国产精品亚洲一区二区三区| 精品无人区一区二区三区| 亚洲国产精品一区二区三区久久 | 精品日韩在线视频一区二区三区| 国产99视频精品一区| 亲子乱av一区二区三区| 国产精品一区二区无线|