搜档网
当前位置:搜档网 › 身份证号验证函数

身份证号验证函数

---执行完这个函数脚本后要在 前台的拦截方案存储过程(SOF_Pos_SaveCheck_qiantai)中
----修改下方处判断,此函数返回0,1 。 1代表身份证号不合规范,0代表正常
/*
if exists
(select 1 from tmp_pos_mxls a(nolock),tmp_pos_mast b (nolock),spkfk c(nolock)
where a.lshh=b.lshh and a.spid=c.spid and c.leibie in('含麻黄碱','抗生素','疫苗','麻醉药品')
and dbo.Idcardcheck(b.idcard)=1
)
begin
set @SaveSQL = '本单有特殊管控药品,请登记身份证号!!'
raiserror(@SaveSQL,16,1)

*/

USE [ksoa_pos]
GO
/****** Object: UserDefinedFunction [dbo].[Idcardcheck] Script Date: 04/15/2014 19:51:01 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
create FUNCTION [dbo].[Idcardcheck](@idcard varchar(20))
RETURNS int AS
BEGIN
declare @a int
set @a=0
if len(@idcard)<>18 or left(@idcard,9)=right(@idcard,9)
begin
set @a=1
end
else if isnumeric(left(@idcard, 17))=0
begin
set @a=1
end
else if isdate(substring(@idcard, 7, 4) + '-' + substring(@idcard, 11, 2) + '-' +
substring(@idcard, 13, 2))= 0
begin
set @a=1
end
--判断年龄 大于16岁 小于120岁
else if substring(@idcard, 7, 4)>1998 or substring(@idcard, 7, 4)<1894
begin
set @a=1
end
/*验证校验位开始*/
DECLARE @validFactors VARCHAR(17),@validCodes VARCHAR(11),@i TINYINT,@iTemp INT
SELECT @validFactors='79A584216379A5842',@validCodes='10X98765432',@i=1,@iTemp=0
WHILE @i<18
BEGIN
SELECT @iTemp=@iTemp+CAST(SUBSTRING(@idcard,@i,1) AS INT)*(CASE SUBSTRING(@validFactors,@i,1)
WHEN 'A' THEN 10 ELSE SUBSTRING(@validFactors,@i,1) END)
,@i=@i+1
END
IF SUBSTRING(@validCodes,@iTemp%11+1,1)<>RIGHT(@idcard,1)
set @a=1
else
set @a=0

return(@a)
END

相关主题