有个表叫TaskDeploy(任务部署的),其中字段Participants以格式用户名,用户名具体如下:
admin,小明,samlin
小明,samlin,test
samlin,test,小明
samlin,admin
samlin,test
samlin,test
好了,现在我要查找有指派给'samlin'用户的任务记录怎么办?
我首先想到的是正则表达式,但Sql提供的功能真是少啊就是一个like加几个通配符,显然是满足不了我的要求的。
于是从网上搜集了一些资料,整理了一下。
下面这个是一个自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.CREATEFUNCTIONdbo.find_regular_expression
(
@sourcevarchar(5000),--需要匹配的源字符串
@regexpvarchar(1000),--正则表达式
@ignorecasebit=0--是否区分大小写,默认为false
)
RETURNSbit--返回结果0-false,1-true
AS
BEGIN
--0(成功)或非零数字(失败),是由OLE自动化对象返回的HRESULT的整数值。
DECLARE@hrinteger
--用于保存返回的对象令牌,以便之后对该对象进行操作
DECLARE@objRegExpintegerDECLARE@objMatchesinteger
--保存结果
DECLARE@resultsbit
/*
创建OLE对象实例,只有sysadmin固定服务器角色的成员才能执行sp_OACreate,并确定机器中有VBScript.RegExp类库
*/
EXEC@hr=sp_OACreate'VBScript.RegExp',@objRegExpOUTPUT
IF@hr0BEGIN
SET@results=0
RETURN@results
END
/*
以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
DimregEx,Match,Matches'建立变量。
SetregEx=NewRegExp'建立一般表达式。
regEx.Pattern=patrn'设置模式。
regEx.IgnoreCase=True'设置是否区分大小写。
regEx.Global=True'设置全局可用性。
setMatches=regEx.Execute(string)'重复匹配集合
RegExpTest=regEx.Execute(strng)'执行搜索。
foreachmatchinmatches'重复匹配集合
RetStr=RetStrMatchfoundatposition
RetStr=RetStrMatch.FirstIndex.MatchValueis'
RetStr=RetStrMatch.Value'.vbCRLFNext
RegExpTest=RetStr
*/
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
--释放已创建的OLE对象
EXEC@hr=sp_OADestroy@objRegExp
IF@hr0BEGIN
SET@results=0
RETURN@results
END
RETURN@results
END
0 评论:
发表评论