SQL Server 验证身份证合法性函数(使用VBScript.RegExp)

原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53895680

-- 建立正则表达式测试函数
CREATE FUNCTION dbo.RegExpTest
    (
      @source VARCHAR(5000),   --需要匹配的源字符串
      @regexp VARCHAR(1000),  --正则表达式
      @ignorecase BIT = 0  --是否区分大小写,默认为false
    )
RETURNS BIT  --返回结果0-false,1-true
AS BEGIN  

 --0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。
    DECLARE @hr INTEGER  

--用于保存返回的对象令牌,以便之后对该对象进行操作
    DECLARE @objRegExp INTEGER
    DECLARE @objMatches INTEGER  

--保存结果
    DECLARE @results BIT  

/*
创建 OLE 对象实例,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate,并确定机器中有VBScript.RegExp类库
*/
    EXEC @hr = sp_OACreate ‘VBScript.RegExp‘, @objRegExp OUTPUT
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
/*
以下三个分别是设置新建对象的三个属性。下面是‘VBScript.RegExp‘中常用的属性举例:
    Dim regEx,Match,Matches         ‘建立变量。
    Set regEx = New RegExp         ‘建立一般表达式。
    regEx.Pattern= patrn         ‘设置模式。
    regEx.IgnoreCase = True         ‘设置是否区分大小写。
    regEx.Global=True                             ‘设置全局可用性。
    set Matches=regEx.Execute(string)             ‘重复匹配集合
    RegExpTest = regEx.Execute(strng)      ‘执行搜索。
   for each match in matches                    ‘重复匹配集合
   RetStr=RetStr &"Match found at position "
   RetStr=RetStr&Match.FirstIndex&".Match Value is ‘"
   RetStr=RetStr&Match.Value&"‘."&vbCRLF Next
   RegExpTest=RetStr  

*/
    EXEC @hr = sp_OASetProperty @objRegExp, ‘Pattern‘, @regexp
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
    EXEC @hr = sp_OASetProperty @objRegExp, ‘Global‘, false
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
    EXEC @hr = sp_OASetProperty @objRegExp, ‘IgnoreCase‘, @ignorecase
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
--调用对象方法
    EXEC @hr = sp_OAMethod @objRegExp, ‘Test‘, @results OUTPUT, @source
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
--释放已创建的 OLE 对象
    EXEC @hr = sp_OADestroy @objRegExp
    IF @hr <> 0
        BEGIN
            SET @results = 0
            RETURN @results
        END
    RETURN @results
   END  

-- 建立身份证验证函数
ALTER  FUNCTION dbo.fn_checkidcard ( @p_idcard VARCHAR(18) )
RETURNS INT
AS BEGIN
    DECLARE @v_regstr VARCHAR(2000) ;
    DECLARE @v_sum INT ;
    DECLARE @v_mod INT ;
    DECLARE @v_checkcode CHAR(11) ;
    SET @v_checkcode = ‘10X98765432‘ ;
    DECLARE @v_checkbit CHAR(1) ;
    DECLARE @v_areacode VARCHAR(2000) ;
    SET @v_areacode = ‘11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,‘ ;  

    DECLARE @l INT ;
    SET @l = LEN(@p_idcard) ;  

    DECLARE @r INT ;
    SET @r = 0 ;  

    IF @l = 15
        BEGIN
            IF CHARINDEX(SUBSTRING(@p_idcard, 1, 2) + ‘,‘, @v_areacode) = 0
                RETURN 0 ;  

            IF ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT) + 1900 ) % 400 = 0 )
                OR ( ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT) + 1900 )
                       % 100 <> 0 )
                     AND ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT)
                             + 1900 ) % 4 = 0 )
                   )
                SET @v_regstr = ‘^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$‘ ;
            ELSE
                SET @v_regstr = ‘^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$‘ ;                    

            IF dbo.RegExpTest(@p_idcard, @v_regstr, 0) = 1
                SET @r = 1 ;
            ELSE
                SET @r = 0 ;
        END ;
    ELSE
        IF @l = 18
            BEGIN
                IF CHARINDEX(SUBSTRING(@p_idcard, 1, 2) + ‘,‘, @v_areacode) = 0
                    RETURN 0 ;  

                IF ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT) + 1900 )
                     % 400 = 0 )
                    OR ( ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT)
                             + 1900 ) % 100 <> 0 )
                         AND ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT)
                                 + 1900 ) % 4 = 0 )
                       )
                    SET @v_regstr = ‘^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$‘ ;
                ELSE
                    SET @v_regstr = ‘^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$‘ ;  

                IF dbo.RegExpTest(@p_idcard, @v_regstr, 0) = 1
                    BEGIN
                        SET @v_sum = ( CAST(SUBSTRING(@p_idcard, 1, 1) AS INT)
                                       + CAST(SUBSTRING(@p_idcard, 11, 1) AS INT) )
                            * 7 + ( CAST(SUBSTRING(@p_idcard, 2, 1) AS INT)
                                    + CAST(SUBSTRING(@p_idcard, 12, 1) AS INT) )
                            * 9 + ( CAST(SUBSTRING(@p_idcard, 3, 1) AS INT)
                                    + CAST(SUBSTRING(@p_idcard, 13, 1) AS INT) )
                            * 10 + ( CAST(SUBSTRING(@p_idcard, 4, 1) AS INT)
                                     + CAST(SUBSTRING(@p_idcard, 14, 1) AS INT) )
                            * 5 + ( CAST(SUBSTRING(@p_idcard, 5, 1) AS INT)
                                    + CAST(SUBSTRING(@p_idcard, 15, 1) AS INT) )
                            * 8 + ( CAST(SUBSTRING(@p_idcard, 6, 1) AS INT)
                                    + CAST(SUBSTRING(@p_idcard, 16, 1) AS INT) )
                            * 4 + ( CAST(SUBSTRING(@p_idcard, 7, 1) AS INT)
                                    + CAST(SUBSTRING(@p_idcard, 17, 1) AS INT) )
                            * 2 + CAST(SUBSTRING(@p_idcard, 8, 1) AS INT) * 1
                            + CAST(SUBSTRING(@p_idcard, 9, 1) AS INT) * 6
                            + CAST(SUBSTRING(@p_idcard, 10, 1) AS INT) * 3 ;  

                        SET @v_mod = @v_sum % 11 ;
                        SET @v_checkbit = SUBSTRING(@v_checkcode, @v_mod + 1,
                                                    1) ;  

                        IF @v_checkbit = SUBSTRING(@p_idcard, 18, 1)
                            SET @r = 1 ;
                        ELSE
                            SET @r = 0 ;
                    END ;
                ELSE
                    RETURN 0 ;
            END ;
    RETURN @r ;
   -- 身份证号码位数不对
   END ;
;  

-- 开启Ole Automation Procedures配置
EXEC sp_configure ‘show advanced options‘, 1
RECONFIGURE
EXEC sp_configure ‘Ole Automation Procedures‘, 1
RECONFIGURE
EXEC sp_configure ‘show advanced options‘, 0
RECONFIGURE  

-- 测试
SELECT dbo.fn_checkidcard(‘110102197203270816‘);  

问题:这种方法对每一行都要创建对象、设置对象属性、释放对象等一系列操作,数据量大时性能很差。但这种在SQL Server中使用正则表达式的方法比较简单。

原文地址:https://www.cnblogs.com/lonelyxmas/p/11294575.html

时间: 2024-10-13 09:28:50

SQL Server 验证身份证合法性函数(使用VBScript.RegExp)的相关文章

SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之前开发的系统要么因为历史原因用的是SQL2000要么根本用不着在SQL Server中启用CLR,所以一直没有尝试.最近因为项目的原因,在这方面做了一个调研,现在在这里分享一下心得. 首先要说明的是要在SQL Server中启用CLR必须是在SQL Server2005及以上版本,其次在默认情况下是

sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值

采用c#开发dll,并添加到sql server 中. 具体代码,可以用visual studio的向导生成模板. using System; using System.Collections; using System.Data; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; using System.IO; using System.Text; [Serializable] [Microsoft.SqlServer

SQL Server 进制转换函数

一.背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下面的映射表“: (Figure1:效果图) 二.十进制转换为十六进制 在网上有很多资料关于使用SQL语句把十进制转换为十六进制的资料,比如: --方式1 SELECT CONVERT(VARBINARY(50), 23785) 执行返回值为0x00005CE9,但是需要注意的是,这本应该返回二进制的

SQL Server -&gt;&gt; FIRST_VALUE和LAST_VALUE函数

两个都是SQL SERVER 2012引入的函数.用于返回在以分组和排序后取得最后一行的某个字段的值.很简单两个函数.ORDER BY字句是必须的,PARITION BY则是可选. 似乎没什么好说的.结果在测试LAST_VALUE函数的时候有个问题. 下面是测试脚本 ;with t as (SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY column_id) as num FROM sys.columns) select num, num/10 as grp_

用SQL Server验证用户名和密码

用SQL Server验证用户名和密码,从页面输入的用户名和密码与数据库的用户名和密码进行匹配,正确则登入,错误则提醒. <form action="index.jsp" method="post" > <!--大的div框架开始--> <div id="div"> <!--左边div框架开始--> <div id="div1"> <p style="

SQL Server - SQL Server 2019 启用SQL Server验证Super Administrator(sa)用户登录

SQL Server 2019 启用SQL Server验证Super Administrator(sa)用户登录 在项目开发过程中通常连接SQL Server时需要用SQL Server方式,所以我们需要先开启这种验证方式,然后再根据需要添加项目用户,设定相关权限. 先用Windows身份验证方式连接数据库,然后按照如下几步设置,完成后重启服务,切换验证方式即可使用sa登录. 作者:Jeremy.Wu   出处:https://www.cnblogs.com/jeremywucnblog/ 本

【SQL server基础】objectproperty()函数

SQL Server OBJECTPROPERTY使用方法 OBJECTPROPERTY 返回有关当前数据库中的模式作用域对象的信息.此函数不能用于不是模式范围的对象,例如数据定义语言(DDL)触发器和事件通知. OBJECTPROPERTY 语法: 1 OBJECTPROPERTY ( id , property ) 参数: id:表示当前数据库中对象ID的表达式.id是int,并且被假定为当前数据库上下文中的模式作用域对象. property:是表示由id指定的对象返回的信息的表达式.属性可

SQL SERVER 中的 object_id()函数

在数据库中有一个系统表sysobjects,里面存储了数据库各个对象的信息.可以查询下看看结果.可以看出每个对象都有一个ID,这个表存储了表,存储过程,触发器,视图等相关信息.注意:字段没有. object_id就是根据对象名称返回该对象的id.  object_name是根据对象id返回对象名称. select object_id(对象名)等同于:  select id from sysobjects where name=对象名 select object_name(id号)等同于:  se

SQL Server 常用内置函数(built-in)持续整理

本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的ID和Name,对象的Schema,对象的定义 OBJECT_ID ( 'schema_name . object_name','object_type' ) OBJECT_NAME ( object_id [, database_id ] ) OBJECT_SCHEMA_NAME ( object