原文: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中使用正则表达式的方法比较简单。

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

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

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  2. SQL Server 进制转换函数

    一.背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下 ...

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

    采用c#开发dll,并添加到sql server 中. 具体代码,可以用visual studio的向导生成模板. using System; using System.Collections; us ...

  4. ylb:SQL Server中的时间函数

    ylbtech-SQL Server:SQL Server-SQL Server中的时间函数 SQL Server中的时间函数. 1,SQL Server中的时间函数 返回顶部 1.   当前系统日期 ...

  5. SQL Server中的DATEPART函数的使用

    下面文章来自:http://blog.csdn.net/hello_world_wusu/article/details/4632049 定义和用法 DATEPART() 函数用于返回日期/时间的单独 ...

  6. 刷新SQL Server所有视图、函数、存储过程

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  7. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  8. SQL Server ->> FIRST_VALUE和LAST_VALUE函数

    两个都是SQL SERVER 2012引入的函数.用于返回在以分组和排序后取得最后一行的某个字段的值.很简单两个函数.ORDER BY字句是必须的,PARITION BY则是可选. 似乎没什么好说的. ...

  9. 用SQL Server验证用户名和密码

    用SQL Server验证用户名和密码,从页面输入的用户名和密码与数据库的用户名和密码进行匹配,正确则登入,错误则提醒. <form action="index.jsp" m ...

随机推荐

  1. use potato

  2. [Luogu] 时间复杂度

    https://www.luogu.org/problemnew/show/P3952 考场上输出的是 "YES" "NO" ++ ,如果不是亲身经历,打死我我 ...

  3. Postman中的全局/环境/集合变量的使用及优先级

    变量的使用场景 Postman的变量主要用于参数化和关联 应用1: 常用变量可以按使用范围设置成集合或全局变量 应用2: 一套接口要在不同的环境上测试时, 可以新建两个环境,比如test环境和stag ...

  4. codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)

    题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...

  5. python itern机制的

    这些变量很可能在许多程序中使用. 通过池化这些对象,Python可以防止对一致使用的对象进行内存分配调用. 1.介于数字-5和256之间的整数 2.字符串仅包含字母.数字或下划线

  6. 01 关于jupyter的环境安装

      jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发 ...

  7. how to force git to overwritten local files

    最佳解决方法 重要提示:如果您有任何本地更改,将会丢失.无论是否有--hard选项,任何未被推送的本地提交都将丢失. 如果您有任何未被Git跟踪的文件(例如上传的用户内容),这些文件将不会受到影响. ...

  8. JWT加密解密

    如何保证WebAPI的安全?1.JWT加密解密.token2.使用https传输协议.3.把用户所有请求的参数信息加上一个只有服务器端知道的secret,做个散列运算,然后到了服务器端,服务器端也做一 ...

  9. 移动端——JS(一)

    javascript(简称js)语言在移动前端可以说必不可少,许多效果都是和js相关的,包括现在移动端的一些框架:jqmobi.jqtouch.sencha touch.jquerymobile等等. ...

  10. centos7修改默认启动模式(图形/命令行)

    centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...