如何在Sql Server 中使用正则表达式

如果能在SqlServer中使用正则表达式,一定会对程序编写有很大帮助,那么如何实现呢?

其实SqlServer本身并不提供这样的功能,但我们如果能够通过SqlServer调用VBScript,那么问题就有解决的可能,这中间我们要先详细了解三个系统级别的存数过程:sp_OACreate,sp_OASetProperty和sp_OAMethodsp_OACreate

翻阅一下帮助文件不难知道,该存储过程可以帮我们生成一个OLE对象的实例。也就是我们可以通过它来建立一个COM对象和系统进行交互,也就意味着在系统层面上几乎没有什么干不了的事情了,当然也包括坏事情,所以要仔细看一下用户在这个存储过程上的执行权限,小心被坏蛋利用哦。

它的语法如下:

sp_OACreateprogid,|clsid,objecttokenOUTPUT[,context]progid:我们要调用的即将被实例化的程序名称

clsid:我们要调用的即将被实例化的类的名称

objecttokenOUTPUT:被生成的对象的句柄或指针,是个整型变量

context:这是个可选的变量,目的是制定你所创建的对象以什么样的方式执行,它有三个值,可供选择:

1=In-process(.dll)OLEserveronly

4=Local(.exe)OLEserveronly

5=Bothin-processandlocalOLEserverallowed

为1,则要求对象在一个ActiveXDLL文件中;

值为4,则要求对象在ActiveXEXE服务器中;

如果是缺省的值5,则可以使用任一自动操作。

一般情况下我们可以使用默认值,即不提供该参数变量。

比如你想在数据库中访问微软的Excel,就可以这样来写:

Declare@Objectint

Declare@RetValint

Exec@RetVal=sp_OACreate'Excel.Application',

@ObjectOUTPUT

这样你就得到一个被实例化的Excel对象的指针:@Object

有了这个指针,你当然可以让它为你尽份内之事了。至于如何给它设置属性发布命令,就要使用到另外两个系统存储过程:sp_OASetProperty和sp_OAMethod,单从名字就能对他们的功能猜个八九不离十吧。

ok,简单介绍如下:

sp_OASetProperty和sp_OAMethodsp_OASetPropertyobjecttoken,propertyname,newvalue[,index...]该存储过程的功能就是设置对象的属性值,对于上面的语法及参数,应该不需要罗嗦了吧。sp_OAMethodobjecttoken,methodname[,returnvalueOUTPUT][,[@parametername=]parameter[OUTPUT][...n]]上面这个存储过程就是那临门一脚--执行对象的一个方法,并可能同时返回对象的输出值,为什么说是可能,而不是一定呢?因为你知道,有些对象方法只是做事情,它并不告诉你结果的。

好了,现在看看如何在SqlServer中调用VBScript来使用正则表达式吧,我们可以把你要做的事情封装成一个用户自定义函数,以后可随时调用。

程序如下:

CREATEFUNCTIONdbo.regexpMatch

(

@sourcevarchar(5000),--被检验的字符串

@regexpvarchar(1000),--正则表达式的字符串

@ignorecasebit=0--忽略大小写

)

RETURNSbit

AS

BEGIN

DECLARE@hrinteger

DECLARE@objRegExpinteger

DECLARE@objMatchesinteger

DECLARE@objMatchinteger

DECLARE@countinteger

DECLARE@resultsbit

EXEC@hr=sp_OACreate'VBScript.RegExp',@objRegExpOUTPUT

IF@hr0BEGIN

SET@results=0

RETURN@results

END

EXEC@hr=sp_OASetProperty@objRegExp,'Pattern',@regexp

IF@hr0BEGIN

SET@results=0

RETURN@results

END

EXEC@hr=sp_OASetProperty@objRegExp,'Global',false

IF@hr0BEGIN

SET@results=0

RETURN@results

END

EXEC@hr=sp_OASetProperty@objRegExp,'IgnoreCase',@ignorecase

IF@hr0BEGIN

SET@results=0

RETURN@results

END

EXEC@hr=sp_OAMethod@objRegExp,'Test',@resultsOUTPUT,@source

IF@hr0BEGIN

SET@results=0

RETURN@results

END

EXEC@hr=sp_OADestroy@objRegExp

IF@hr0BEGIN

SET@results=0

RETURN@results

END

RETURN@results

END

有没有注意到程序的最后还用了一个sp_OADestroy,目的就是释放掉对象的实例,还内存自由的空间

相关推荐