|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。 |
|