仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 700|回复: 8
打印 上一主题 下一主题

[学习教程] 在sql server中利用存储历程考证身份证号码是不是正当

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一个语句分成两个event(实际上不止,其他可以忽略),一个table_mapevent和一个Rows_log_event。Table_mapevent是一样的,主要看Rows_log_event。在一些职员信息收录的体系中,大概会请求填进职员的身份证号码,但要怎样来考证填进的身份证号码的格局是不是正当呢。我们将考证的sql写成一个存储历程,以便利反复挪用。

起首我们要分明我国身份号码的构成划定规矩:
1,18位身份证号码的构成:6位区域编码+8位出身年代日+3位编号(奇数代表男,偶数代表女)+1位校验码
2,15位身份证号码的构成:6位区域编码+6位出身年代日+3位编号(奇数代表男,偶数代表女)

上面是该存储历程的一切sql
--=============================================
--Author:<Author,,Name>
--Createdate:<CreateDate,,>
--Description:        <Description,,>
--=============================================
CreateFUNCTION[dbo].[udf_IsvalidIDCard]
(
@IDCardNovarchar(50)=
)
RETURNSbit
AS
/*******************************************************************
函数称号:udf_IsvalidIDCard()
参数:@IDCardNostring身份证号码
前往值:bit是不是无效
功效形貌:判别身份证号码是不是正当

备注:今朝中国的身份证号码有18位和15位.
1,18位身份证号码的构成:6位区域编码+8位出身年代日+3位编号(奇男偶女)+1位校验码
2,15位身份证号码的构成:6位区域编码+6位出身年代日+3位编号(奇男偶女)
*******************************************************************/
BEGIN

declare@Lengthint,
        @Loopint,
        @Sumint
declare@SingleCharchar

set@Sum=0
if@IDCardNoisnullor@IDCardNo=nullorltrim(rtrim(@IDCardNo))=
begin
return0
end

set@Length=len(@IDCardNo)
--判别位数
if@Length18and@Length15
        begin
        return0       
        end
if@Length=18
        begin
        ifisnumeric(left(@IDCardNo,17))=0
begin       
return0
end
        ifisdate(substring(@IDCardNo,7,4)+-+substring(@IDCardNo,11,2)+-+substring(@IDCardNo,13,2))=0
begin
return0
end
        set@Loop=17
        while(@Loop>=1)
begin
set@Sum=@Sum+convert(int,substring(@IDCardNo,@Loop,1))*(power(2,(18-@Loop))%11)
set@Loop=@Loop-1
end
        set@Loop=@Sum%11
        if@Loop=0
begin
set@SingleChar=1
end
        elseif@Loop=1
begin
set@SingleChar=0
end
        elseif@Loop=2
begin
set@SingleChar=X
end
        else
begin
set@SingleChar=convert(varchar(2),(12-@Loop))
end
        iflower(Right(@IDCardNo,1))lower(@SingleChar)
begin
return0
end
        end
elseif@Length=15
        begin
        ifisnumeric(@IDCardNo)=0
begin
return0
end
        ifisdate(19+substring(@IDCardNo,7,2)+-+substring(@IDCardNo,9,2)+-+substring(@IDCardNo,11,2))=0
begin
return0
end
        end

return1

END

创立终了后,我们可使用以下sql挪用来测试是不是准确:
declare@resultbit
exec@result=dbo.udf_IsvalidIDCard身份证号码
select@result

前往1,代表身份证号码准确,
前往0,代表身份证号码毛病。

复杂解说一下以上用到的体系函数意义:
POWER函数:前往给定表达式的指定幂的值。
好比:selectPOWER(2,3),就前往2的3次幂,即8

LOWER函数:将年夜写字符数据转换成小写后前往字符表达式。
好比:selectLOWER(ABC),前往abc

substring函数:前往$sourceString的子串,从$startingLoc指定的地位入手下手,长度为$length指定的字符数。
好比:selectsubstring(abcd,1,2),前往ab
注重:该函数十分风趣
1,$sourceString参数的索引从1入手下手计。
2,假如你是从0地位入手下手取值,也不会错,但只会前往a
3,假如你是从-1地位入手下手取值,也不会错,但前往空,但把$length数据填年夜一些,又会前往值了。
从下面的测试应当能够得出,假如$startingLoc小于或即是0,那末,substring的参数酿成了
string($sourceString,1,$length-1+$startingLoc)
即selectsubstring(abcd,0,2)==selectsubstring(abcd,1,1),
selectsubstring(abcd,-1,2)==selectsubstring(abcd,1,2-1+(-1))
selectsubstring(abcd,-1,3)==selectsubstring(abcd,1,3-1+(-1))
不断定公式就是如许的,但前往了局和这个是一样的。

isdate函数:断定输出表达式是不是为无效日期。

ISNUMERIC函数:断定表达式是不是为无效的数值范例。

CONVERT函数:将一种数据范例的表达式显式转换为另外一种数据范例的表达式。虽然可以将一个droptable语句转换成先delete再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-18 12:01:59 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
小妖女 该用户已被删除
板凳
发表于 2015-1-25 10:57:29 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
飘灵儿 该用户已被删除
地板
发表于 2015-2-2 21:55:39 来自手机 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
莫相离 该用户已被删除
5#
发表于 2015-2-8 08:36:48 | 只看该作者
无法深入到数据库系统层面去了解和探究
小女巫 该用户已被删除
6#
发表于 2015-2-25 05:59:16 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-7 18:22:05 | 只看该作者
无法深入到数据库系统层面去了解和探究
因胸联盟 该用户已被删除
8#
发表于 2015-3-15 11:48:10 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
只想知道 该用户已被删除
9#
发表于 2015-3-22 01:10:18 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:06

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表