您的位置:首页 > 数据库

SQL函数验证身份证号码是否有效

2011-10-15 16:12 447 查看
-- =============================================

-- 作 者: 黄江华

-- 日 期: 2008-05-27

-- 描 述: 身份证号码是否有效

-- 备 注:

-- 身份证号只有15或18位

-- 如果是15位身份证 则只验证日期和是否数字格式

-- 18位身份证 验证日期 校验位

-- =============================================

IF EXISTS (SELECT * FROM sys.objects

WHERE object_id = OBJECT_ID(N'dbo.fun_IsValidID')

AND type in ('IF', 'FN', 'TF'))

DROP FUNCTION dbo.fun_IsValidID

GO

CREATE FUNCTION dbo.fun_IsValidID(@ID Varchar(18))

-- Add the parameters for the stored procedure here

RETURNS BIT

AS

BEGIN

DECLARE @ValidFactors VARCHAR(17),

@ValidCodes VARCHAR(11),

@I TINYINT,

@iTemp INT

--位数不满足则为非法ID

IF Len(@ID) <> 15 AND Len(@ID) <> 18

RETURN(0);

--如果是15位身份证 则只验证日期和是否数字格式

IF LEN(@ID)=15

IF ISDATE('19'+SUBSTRING(@ID,7,6))=0 OR ISNUMERIC(@ID)=0

RETURN(0);

ELSE

RETURN(1);

/*18位身份证 验证日期 校验位 */

--验证日期和前17位是否数字格式

IF ISDATE(SUBSTRING(@ID,7,8))=0 OR ISNUMERIC(SUBSTRING(@ID,1,17))=0

RETURN(0);

--验证校验位开始

SELECT @ValidFactors='79A584216379A5842',

@ValidCodes='10X98765432',

@I=1,@iTemp=0

WHILE @i<18

BEGIN

SELECT

@iTemp=@iTemp+CAST(SUBSTRING(@ID,@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(@ID,1)

RETURN(1);

ELSE

RETURN(0);

RETURN NULL;

END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: