CREATE FUNCTION [dbo].[f_CheckID](@Card varchar(20))
RETURNS TINYINT
AS
BEGIN
DECLARE @res INT
IF ISNUMERIC(LEFT(@Card,17)) = 0 --不是数字
set @res = 1 --有非法字符
ELSE IF CHARINDEX(RIGHT(@Card, 1),'0123456789X') = 0
SET @res= 2 -- 最后一码有非法字符
ELSE IF LEN(@Card)<>15 AND LEN(@Card)<> 18
SET @res= 3 -- 长度错误
ELSE IF @Card IS NULL
SET @res= 5 -- 身份证为NULL
ELSE if LEN(@Card) =18 AND CASE (SUBSTRING(@Card,1,1) * 7 +
SUBSTRING(@Card,2,1)*9 +
SUBSTRING(@Card,3,1)*10 +
SUBSTRING(@Card,4,1)*5 +
SUBSTRING(@Card,5,1)*8 +
SUBSTRING(@Card,6,1)*4 +
SUBSTRING(@Card,7,1) * 2 +
SUBSTRING(@Card,8,1) * 1 +
SUBSTRING(@Card,9,1) * 6 +
SUBSTRING(@Card,10,1) * 3 +
SUBSTRING(@Card,11,1) * 7 +
SUBSTRING(@Card,12,1) * 9 +
SUBSTRING(@Card,13,1) * 10+
SUBSTRING(@Card,14,1) * 5 +
SUBSTRING(@Card,15,1) * 8 +
SUBSTRING(@Card,16,1) * 4 +
SUBSTRING(@Card,17,1)*2) % 11
WHEN 0 THEN '1'
WHEN 1 THEN '0'
WHEN 2 THEN 'X'
WHEN 3 THEN '9'
WHEN 4 THEN '8'
WHEN 5 THEN '7'
WHEN 6 THEN '6'
WHEN 7 THEN '5'
WHEN 8 THEN '4'
WHEN 9 THEN '3'
WHEN 10 THEN '2'
ELSE 'Err' END = RIGHT(@Card,1)
BEGIN
SET @res = 0 --合法身份证
end
ELSE IF LEN(@Card) =15
SET @res = 0 --合法身份证
ELSE
SET @res = 4 --校验码错误
RETURN @res;
END
RETURNS TINYINT
AS
BEGIN
DECLARE @res INT
IF ISNUMERIC(LEFT(@Card,17)) = 0 --不是数字
set @res = 1 --有非法字符
ELSE IF CHARINDEX(RIGHT(@Card, 1),'0123456789X') = 0
SET @res= 2 -- 最后一码有非法字符
ELSE IF LEN(@Card)<>15 AND LEN(@Card)<> 18
SET @res= 3 -- 长度错误
ELSE IF @Card IS NULL
SET @res= 5 -- 身份证为NULL
ELSE if LEN(@Card) =18 AND CASE (SUBSTRING(@Card,1,1) * 7 +
SUBSTRING(@Card,2,1)*9 +
SUBSTRING(@Card,3,1)*10 +
SUBSTRING(@Card,4,1)*5 +
SUBSTRING(@Card,5,1)*8 +
SUBSTRING(@Card,6,1)*4 +
SUBSTRING(@Card,7,1) * 2 +
SUBSTRING(@Card,8,1) * 1 +
SUBSTRING(@Card,9,1) * 6 +
SUBSTRING(@Card,10,1) * 3 +
SUBSTRING(@Card,11,1) * 7 +
SUBSTRING(@Card,12,1) * 9 +
SUBSTRING(@Card,13,1) * 10+
SUBSTRING(@Card,14,1) * 5 +
SUBSTRING(@Card,15,1) * 8 +
SUBSTRING(@Card,16,1) * 4 +
SUBSTRING(@Card,17,1)*2) % 11
WHEN 0 THEN '1'
WHEN 1 THEN '0'
WHEN 2 THEN 'X'
WHEN 3 THEN '9'
WHEN 4 THEN '8'
WHEN 5 THEN '7'
WHEN 6 THEN '6'
WHEN 7 THEN '5'
WHEN 8 THEN '4'
WHEN 9 THEN '3'
WHEN 10 THEN '2'
ELSE 'Err' END = RIGHT(@Card,1)
BEGIN
SET @res = 0 --合法身份证
end
ELSE IF LEN(@Card) =15
SET @res = 0 --合法身份证
ELSE
SET @res = 4 --校验码错误
RETURN @res;
END