设为首页 收藏本站
查看: 769|回复: 0

[经验分享] 如何在Sql Server 中使用正则表达式

[复制链接]

尚未签到

发表于 2016-11-4 09:38:28 | 显示全部楼层 |阅读模式
  如果能在Sql Server中使用正则表达式,一定会对程序编写有很大帮助,那么如何实现呢?
  其实Sql Server本身并不提供这样的功能,但我们如果能够通过Sql Server 调用VBScript,那么问题就有解决的可能,这中间我们要先详细了解三个系统级别的存数过程:sp_OACreate , sp_OASetProperty 和 sp_OAMethod sp_OACreate
  翻阅一下帮助文件不难知道,该存储过程可以帮我们生成一个OLE对象的实例。也就是我们可以通过它来建立一个COM对象和系统进行交互,也就意味着在系统层面上几乎没有什么干不了的事情了,当然也包括坏事情,所以要仔细看一下用户在这个存储过程上的执行权限,小心被坏蛋利用哦。
  它的语法如下:
  sp_OACreateprogid, | clsid, objecttokenOUTPUT [ ,context ]  progid: 我们要调用的即将被实例化的程序名称
  clsid : 我们要调用的即将被实例化的类的名称
  objecttoken OUTPUT :被生成的对象的句柄或指针,是个整型变量
  context :这是个可选的变量,目的是制定你所创建的对象以什么样的方式执行,它有三个值,可供选择:
  1 = In-process (.dll) OLE server only  
  4 = Local (.exe) OLE server only
  5 = Both in-process and local OLE server allowed
  为1,则要求对象在一个ActiveX DLL文件中;
  值为4,则要求对象在ActiveX EXE服务器中;
  如果是缺省的值5,则可以使用任一自动操作。
  一般情况下我们可以使用默认值,即不提供该参数变量。
  比如你想在数据库中访问微软的Excel,就可以这样来写:
  Declare @Object int
  Declare @RetVal int
  Exec @RetVal=sp_OACreate 'Excel.Application',
  @Object OUTPUT
  这样你就得到一个被实例化的Excel对象的指针:@Object
  有了这个指针,你当然可以让它为你尽份内之事了。至于如何给它设置属性发布命令,就要使用到另外两个系统存储过程:sp_OASetProperty 和 sp_OAMethod, 单从名字就能对他们的功能猜个八九不离十吧。
  ok,简单介绍如下:
  sp_OASetProperty 和 sp_OAMethod sp_OASetProperty objecttoken, propertyname, newvalue [ , index... ] 该存储过程的功能就是设置对象的属性值,对于上面的语法及参数,应该不需要罗嗦了吧。 sp_OAMethodobjecttoken, methodname [ , returnvalueOUTPUT ] [ , [ @parametername = ]parameter [ OUTPUT ] [ ...n ] ]  上面这个存储过程就是那临门一脚--执行对象的一个方法,并可能同时返回对象的输出值,为什么说是可能,而不是一定呢?因为你知道,有些对象方法只是做事情,它并不告诉你结果的。
  好了,现在看看如何在Sql Server中调用VBScript来使用正则表达式吧,我们可以把你要做的事情封装成一个用户自定义函数,以后可随时调用。
  程序如下:
  CREATE FUNCTION dbo.regexpMatch
  (
  @source varchar(5000), -- 被检验的字符串
  @regexp varchar(1000), -- 正则表达式的字符串
  @ignorecase bit = 0    -- 忽略大小写
  )
  RETURNS bit
  AS
  BEGIN
  DECLARE @hr integer
  DECLARE @objRegExp integer
  DECLARE @objMatches integer
  DECLARE @objMatch integer
  DECLARE @count integer
  DECLARE @results bit
  EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  IF @hr  0 BEGIN
  SET @results = 0
  RETURN @results
  END
  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
  EXEC @hr = sp_OADestroy @objRegExp
  IF @hr  0 BEGIN
  SET @results = 0
  RETURN @results
  END
  RETURN @results
  END
  有没有注意到程序的最后还用了一个sp_OADestroy,目的就是释放掉对象的实例,还内存自由的空间

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295618-1-1.html 上篇帖子: 通过 SQL Server 2005 索引视图提高性能 下篇帖子: 在 SQL Server 2005 中配置数据库邮件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表