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

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

  1. -- 建立正则表达式测试函数
  2. CREATE FUNCTION dbo.RegExpTest
  3. (
  4. @source VARCHAR(5000), --需要匹配的源字符串
  5. @regexp VARCHAR(1000), --正则表达式
  6. @ignorecase BIT = 0 --是否区分大小写,默认为false
  7. )
  8. RETURNS BIT --返回结果0-false1-true
  9. AS BEGIN
  10. --0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。
  11. DECLARE @hr INTEGER
  12. --用于保存返回的对象令牌,以便之后对该对象进行操作
  13. DECLARE @objRegExp INTEGER
  14. DECLARE @objMatches INTEGER
  15. --保存结果
  16. DECLARE @results BIT
  17. /*
  18. 创建 OLE 对象实例,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate,并确定机器中有VBScript.RegExp类库
  19. */
  20. EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  21. IF @hr <> 0
  22. BEGIN
  23. SET @results = 0
  24. RETURN @results
  25. END
  26. /*
  27. 以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
  28. Dim regEx,Match,Matches '建立变量。
  29. Set regEx = New RegExp '建立一般表达式。
  30. regEx.Pattern= patrn '设置模式。
  31. regEx.IgnoreCase = True '设置是否区分大小写。
  32. regEx.Global=True '设置全局可用性。
  33. set Matches=regEx.Execute(string) '重复匹配集合
  34. RegExpTest = regEx.Execute(strng) '执行搜索。
  35. for each match in matches '重复匹配集合
  36. RetStr=RetStr &"Match found at position "
  37. RetStr=RetStr&Match.FirstIndex&".Match Value is '"
  38. RetStr=RetStr&Match.Value&"'."&vbCRLF Next
  39. RegExpTest=RetStr
  40. */
  41. EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
  42. IF @hr <> 0
  43. BEGIN
  44. SET @results = 0
  45. RETURN @results
  46. END
  47. EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
  48. IF @hr <> 0
  49. BEGIN
  50. SET @results = 0
  51. RETURN @results
  52. END
  53. EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
  54. IF @hr <> 0
  55. BEGIN
  56. SET @results = 0
  57. RETURN @results
  58. END
  59. --调用对象方法
  60. EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
  61. IF @hr <> 0
  62. BEGIN
  63. SET @results = 0
  64. RETURN @results
  65. END
  66. --释放已创建的 OLE 对象
  67. EXEC @hr = sp_OADestroy @objRegExp
  68. IF @hr <> 0
  69. BEGIN
  70. SET @results = 0
  71. RETURN @results
  72. END
  73. RETURN @results
  74. END
  75. -- 建立身份证验证函数
  76. ALTER FUNCTION dbo.fn_checkidcard ( @p_idcard VARCHAR(18) )
  77. RETURNS INT
  78. AS BEGIN
  79. DECLARE @v_regstr VARCHAR(2000) ;
  80. DECLARE @v_sum INT ;
  81. DECLARE @v_mod INT ;
  82. DECLARE @v_checkcode CHAR(11) ;
  83. SET @v_checkcode = '10X98765432' ;
  84. DECLARE @v_checkbit CHAR(1) ;
  85. DECLARE @v_areacode VARCHAR(2000) ;
  86. 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,' ;
  87. DECLARE @l INT ;
  88. SET @l = LEN(@p_idcard) ;
  89. DECLARE @r INT ;
  90. SET @r = 0 ;
  91. IF @l = 15
  92. BEGIN
  93. IF CHARINDEX(SUBSTRING(@p_idcard, 1, 2) + ',', @v_areacode) = 0
  94. RETURN 0 ;
  95. IF ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT) + 1900 ) % 400 = 0 )
  96. OR ( ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT) + 1900 )
  97. % 100 <> 0 )
  98. AND ( ( CAST(( SUBSTRING(@p_idcard, 6, 2) ) AS INT)
  99. + 1900 ) % 4 = 0 )
  100. )
  101. 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}$' ;
  102. ELSE
  103. 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}$' ;
  104. IF dbo.RegExpTest(@p_idcard, @v_regstr, 0) = 1
  105. SET @r = 1 ;
  106. ELSE
  107. SET @r = 0 ;
  108. END ;
  109. ELSE
  110. IF @l = 18
  111. BEGIN
  112. IF CHARINDEX(SUBSTRING(@p_idcard, 1, 2) + ',', @v_areacode) = 0
  113. RETURN 0 ;
  114. IF ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT) + 1900 )
  115. % 400 = 0 )
  116. OR ( ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT)
  117. + 1900 ) % 100 <> 0 )
  118. AND ( ( CAST(( SUBSTRING(@p_idcard, 6, 4) ) AS INT)
  119. + 1900 ) % 4 = 0 )
  120. )
  121. 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]$' ;
  122. ELSE
  123. 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]$' ;
  124. IF dbo.RegExpTest(@p_idcard, @v_regstr, 0) = 1
  125. BEGIN
  126. SET @v_sum = ( CAST(SUBSTRING(@p_idcard, 1, 1) AS INT)
  127. + CAST(SUBSTRING(@p_idcard, 11, 1) AS INT) )
  128. * 7 + ( CAST(SUBSTRING(@p_idcard, 2, 1) AS INT)
  129. + CAST(SUBSTRING(@p_idcard, 12, 1) AS INT) )
  130. * 9 + ( CAST(SUBSTRING(@p_idcard, 3, 1) AS INT)
  131. + CAST(SUBSTRING(@p_idcard, 13, 1) AS INT) )
  132. * 10 + ( CAST(SUBSTRING(@p_idcard, 4, 1) AS INT)
  133. + CAST(SUBSTRING(@p_idcard, 14, 1) AS INT) )
  134. * 5 + ( CAST(SUBSTRING(@p_idcard, 5, 1) AS INT)
  135. + CAST(SUBSTRING(@p_idcard, 15, 1) AS INT) )
  136. * 8 + ( CAST(SUBSTRING(@p_idcard, 6, 1) AS INT)
  137. + CAST(SUBSTRING(@p_idcard, 16, 1) AS INT) )
  138. * 4 + ( CAST(SUBSTRING(@p_idcard, 7, 1) AS INT)
  139. + CAST(SUBSTRING(@p_idcard, 17, 1) AS INT) )
  140. * 2 + CAST(SUBSTRING(@p_idcard, 8, 1) AS INT) * 1
  141. + CAST(SUBSTRING(@p_idcard, 9, 1) AS INT) * 6
  142. + CAST(SUBSTRING(@p_idcard, 10, 1) AS INT) * 3 ;
  143. SET @v_mod = @v_sum % 11 ;
  144. SET @v_checkbit = SUBSTRING(@v_checkcode, @v_mod + 1,
  145. 1) ;
  146. IF @v_checkbit = SUBSTRING(@p_idcard, 18, 1)
  147. SET @r = 1 ;
  148. ELSE
  149. SET @r = 0 ;
  150. END ;
  151. ELSE
  152. RETURN 0 ;
  153. END ;
  154. RETURN @r ;
  155. -- 身份证号码位数不对
  156. END ;
  157. ;
  158. -- 开启Ole Automation Procedures配置
  159. EXEC sp_configure 'show advanced options', 1
  160. RECONFIGURE
  161. EXEC sp_configure 'Ole Automation Procedures', 1
  162. RECONFIGURE
  163. EXEC sp_configure 'show advanced options', 0
  164. RECONFIGURE
  165. -- 测试
  166. 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. Android input输入框 移动页面input手机键盘中的“搜索”按键

    动页面input手机键盘中的“搜索”按键 满足以下几点机即可: input type="search"    放到form标签中    使用action属性 <form ac ...

  2. Vbox中多台虚拟机搭建简单子网

    一.目标拓扑结构: 要使192.168.31.1和192.168.32.1互相ping通. 二.步骤及问题: 1.路由器配置 SEED_Router配置IP并开启路由转发协议: ifconfig et ...

  3. LeetCode 229. 求众数 II(Majority Element II )

    题目描述 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2,3] 输出: ...

  4. flutter常用内置动画组件

    文章目录 AnimatedContainer AnimatedCrossFade Hero AnimatedBuilder DecoratedBoxTransition FadeTransition ...

  5. OpenCV中出现“Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005C8ECFFA80 处。”的异常

    对于OpenCV的安装 要感谢网友空晴拜小白提供的教程 链接如下: https://blog.csdn.net/sinat_36264666/article/details/73135823?ref= ...

  6. 前端知识点回顾之重点篇——CSS中的BFC

    BFC布局(Block Formatting Contexts) 来源:https://www.cnblogs.com/lzbk/p/6057097.html 块级格式化上下文是页面中的一块渲染区域, ...

  7. 怎么让C#项目自动复制NuGet中的dll引用到输出目录?

    1.从vs中关闭项目 2.用记事本打开csproj文件 3.  在<PropertyGroup> 和 </PropertyGroup>之间添加一行: <CopyLocal ...

  8. webstrom配置node语法提示

    一.mac下打开设置 二.输入node,找到node.js npm,勾选上对勾就好了. 第三.按住ctr,点击右键可以点进去就可以了.

  9. close connection error java.sql.SQLRecoverableException: IO Error: Broken pipe

    java.sql.SQLRecoverableException: IO Error: Broken pipe Table of Contents 1. 错误信息 2. 分析 2.1. 连接池 2.2 ...

  10. Laravel中Session的使用

    以file为示例 1.Http request session方法$request->session()->put('key1','value1');echo $request->s ...