返回顶部
首页 > 资讯 > 数据库 >SqlServer2000身份证合法校验函数的实现方法
  • 871
分享到

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

2024-04-02 19:04:59 871人浏览 八月长安
摘要

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

这篇文章主要讲解了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
您可能感兴趣的文档:

--结束END--

本文标题: SqlServer2000身份证合法校验函数的实现方法

本文链接: https://lsjlt.com/news/43062.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作