文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SqlServer2000身份证合法校验函数的实现方法

2024-04-02 19:55

关注

这篇文章主要讲解了SqlServer2000身份证合法校验函数的实现方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

下面看下sqlserver2000身份证校验的代码,具体代码如下所示:


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

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%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

-- ----------------------以下存储过程是遍历整个表,添加字段并修改校验------------------------



-- 表名:a_idcard , 列 idcard 原身份证, card 标准(新添加),result校验结果(新添加)

-- 添加标准身份证字段
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
-- 添加校验结果字段
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

--遍历结果
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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯