标签归档:身份证号验证

mssql sqlserver 设置数据表中列只可插入”身份证号码”的方法分享


摘要:
下文讲述将“数据表”的约束条件设置为,只可插入”身份证号码”的方法分享,如下所示:
实验环境:sql server 2008 R2


实现思路:
1.新建身份证号码验证函数
2.在数据表建立的时候,约束中输入此身份证号码验证方法,如下:


    ---创建身份证号码验证函数 ---返回1代表为身份证,反之身份证号码异常

   CREATE FUNCTION [dbo].[fn_shenFenZhengYanZheng] ( @IDNo VARCHAR(18) )
		RETURNS BIT
   AS
    BEGIN
        IF LEN(@IDNo) <> 15
            AND LEN(@IDNo) <> 18 
            RETURN(0);
			--身份证号码位数错误
        IF LEN(@IDNo) = 15
            IF ISDATE('19' + SUBSTRING(@IDNo, 7, 6)) = 0
                OR ISNUMERIC(@IDNo) = 0
                RETURN(0);
            ELSE
                RETURN(1);
 
		--18位身份中日期校验
        IF ISDATE(SUBSTRING(@IDNo, 7, 8)) = 0
            OR ISNUMERIC(SUBSTRING(@IDNo, 1, 17)) = 0    --验证日期和前17位是否数字格式
            RETURN(0);
		--验证 校验位 
        DECLARE @valid1 VARCHAR(17) ,
            @valid2 VARCHAR(11) ,
            @i TINYINT ,
            @iTemp INT;
        SELECT  @valid1 = '79A584216379A5842',
                     @valid2 = '10X98765432', @i = 1, @iTemp = 0;
        WHILE @i < 18
            BEGIN
                SELECT  @iTemp = @iTemp
                        + CAST(SUBSTRING(@IDNo, @i, 1) AS INT)
                        * ( CASE SUBSTRING(@valid1, @i, 1)
                              WHEN 'A' THEN 10
                              ELSE SUBSTRING(@valid1, @i, 1)
                            END ), @i = @i + 1;
            END;
        IF SUBSTRING(@valid2, @iTemp % 11 + 1, 1) = RIGHT(@IDNo, 1)
            RETURN 1;
        ELSE
            RETURN 0;
        RETURN NULL;
    END;
 
 
GO
	 ---建表

     CREATE TABLE [dbo].[maomao365](
	[keyId] [int] IDENTITY(1,1) NOT NULL,
	[info] [varchar](36) NULL
)  
GO

 ---添加约束
ALTER TABLE [dbo].[maomao365]  WITH CHECK ADD  CONSTRAINT [chkShenFenZheng] CHECK  (([dbo].[fn_shenFenZhengYanZheng]([info])=(1)))
GO

ALTER TABLE [dbo].[maomao365] CHECK CONSTRAINT [chkShenFenZheng]
GO



---数据测试

insert into [maomao365]
(info)values('错误身份证号码测试')
go

insert into [maomao365]
(info)values('110101201505014239') ---正确身份证号码测试

go

  truncate table maomao365
 drop table maomao365
go
 drop function dbo.fn_shenFenZhengYanZheng
 go

mssql sqlserver sql函数验证身份证号码的方法分享


摘要:
下文讲述使用sql函数的方法分享身份证号码验证方法,如下所示:
实验环境:sql server 2008 R2


下文将举例使用sql函数的方式验证身份证号的正确性,如下所示:
例:

 ---新建sql函数
CREATE FUNCTION [dbo].[fn_shenFenZhengYanZheng] ( @IDNo VARCHAR(18) )
RETURNS BIT
AS
    BEGIN
        IF LEN(@IDNo) <> 15
            AND LEN(@IDNo) <> 18 
            RETURN(0);
			--身份证号码位数错误
        IF LEN(@IDNo) = 15
            IF ISDATE('19' + SUBSTRING(@IDNo, 7, 6)) = 0
                OR ISNUMERIC(@IDNo) = 0
                RETURN(0);
            ELSE
                RETURN(1);
 
		--18位身份中日期校验
        IF ISDATE(SUBSTRING(@IDNo, 7, 8)) = 0
            OR ISNUMERIC(SUBSTRING(@IDNo, 1, 17)) = 0    --验证日期和前17位是否数字格式
            RETURN(0);
		--验证 校验位 
        DECLARE @valid1 VARCHAR(17) ,
            @valid2 VARCHAR(11) ,
            @i TINYINT ,
            @iTemp INT;
        SELECT  @valid1 = '79A584216379A5842',
                     @valid2 = '10X98765432', @i = 1, @iTemp = 0;
        WHILE @i < 18
            BEGIN
                SELECT  @iTemp = @iTemp
                        + CAST(SUBSTRING(@IDNo, @i, 1) AS INT)
                        * ( CASE SUBSTRING(@valid1, @i, 1)
                              WHEN 'A' THEN 10
                              ELSE SUBSTRING(@valid1, @i, 1)
                            END ), @i = @i + 1;
            END;
        IF SUBSTRING(@valid2, @iTemp % 11 + 1, 1) = RIGHT(@IDNo, 1)
            RETURN 1;
        ELSE
            RETURN 0;
        RETURN NULL;
    END;
 
 
GO

SELECT  dbo.fn_shenFenZhengYanZheng('9891313133878141414');