这几天有个项目需要从表的某个字段判断是否存在某些规则的字符串,大概如下:
有个表叫TaskDeploy(任务部署的),其中字段Participants以格式 用户名,用户名 具体如下:
admin,小明,samlin
小明,samlin,test
samlin,test,小明
samlin,admin
samlin,test
samlin,test
好了,现在我要查找有指派给 'samlin'用户的任务记录怎么办?
我首先想到的是正则表达式,但Sql提供的功能真是少啊就是一个 like 加几个通配符,显然是满足不了我的要求的
于是从网上搜集了一些资料,整理了一下。
下面这个是一个自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.
CREATE
FUNCTION
dbo.find_regular_expression
(
@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
下面是一个简单的测试sql语句,可以直接在查询分析器中运行。
DECLARE
@intLength
AS
INTEGER
DECLARE
@vchRegularExpression
AS
VARCHAR
(
50
)
DECLARE
@vchSourceString
as
VARCHAR
(
50
)
DECLARE
@vchSourceString2
as
VARCHAR
(
50
)
DECLARE
@bitHasNoSpecialCharacters
as
BIT
--
初始化变量
SET
@vchSourceString
=
'
Test one This is a test!!
'
SET
@vchSourceString2
=
'
Test two This is a test
'
--
我们的正则表达式应该类似于
--
[a-zA-Z ]{}
--
如: [a-zA-Z ]{10} 一个十字符的字符串
--
获得字符串长度
SET
@intLength
=
LEN
(
@vchSourceString
)
--
设置完整的正则表达式
SET
@vchRegularExpression
=
'
[a-zA-Z ]{
'
+
CAST
(
@intLength
as
varchar
)
+
'
}
'
--
是否有任何特殊字符
SET
@bitHasNoSpecialCharacters
=
dbo.find_regular_expression(
@vchSourceString
,
@vchRegularExpression
,
0
)
PRINT
@vchSourceString
IF
@bitHasNoSpecialCharacters
=
1
BEGIN
PRINT
'
No special characters.
'
END
ELSE
BEGIN
PRINT
'
Special characters found.
'
END
PRINT
'
**************
'
--
获得字符串长度
SET
@intLength
=
LEN
(
@vchSourceString2
)
--
设置完整的正则表达式
SET
@vchRegularExpression
=
'
[a-zA-Z ]{
'
+
CAST
(
@intLength
as
varchar
)
+
'
}
'
--
是否有任何特殊字符
SET
@bitHasNoSpecialCharacters
=
dbo.find_regular_expression(
@vchSourceString2
,
@vchRegularExpression
,
0
)
PRINT
@vchSourceString2
IF
@bitHasNoSpecialCharacters
=
1
BEGIN
PRINT
'
No special characters.
'
END
ELSE
BEGIN
PRINT
'
Special characters found.
'
END
GO
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-589279/,如需转载,请注明出处,否则将追究法律责任。