|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。正则
T-SQL中的正则表达式
原CoryKoski
宣布工夫:2003/06/24
本文来自CoryKoski。Cory写道:“我比来碰到一个成绩,就是试图在数据库域中搜刮一个正则表达式。还没有一个版本的SQLServer外部撑持正则表达式,但我发明了一个将正则表达式的一切长处增加到你的T_SQL使用的办法。为了更简单的利用正则表达式,我们可使用自界说函数(UserDefinedFunction,UDF)来匡助我们并使事情简便。”
在这个办理计划中,我们必要SQLServer2000或更高。我们还必要断定呆板中有VBScript.RegExp类库,这随年夜多半Windows2000servers中的WindowsScripting包配有。若你正在利用一个更早版本的Windows,你必需为你的操纵体系下载最新版的WindowsScripting。
自界说函数
上面是我的自界说函数,可用来在源字符串中搜刮一个正则形式表达式。
CREATEFUNCTIONdbo.find_regular_expression
(
@sourcevarchar(5000),
@regexpvarchar(1000),
@ignorecasebit=0
)
RETURNSbit
AS
BEGIN
DECLARE@hrinteger
DECLARE@objRegExpinteger
DECLARE@objMatchesinteger
DECLARE@objMatchinteger
DECLARE@countinteger
DECLARE@resultsbit
EXEC@hr=sp_OACreateVBScript.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
将这个UDF保留到你的数据库中,并断定有受权来运转它。固然,你也得确保运转它的人有运转sp_OAxxxxx类扩大存储历程的权限。
这个函数已确保一般运转,而且即使是和COM工具一同利用,也仍是挺快的。
举例
利用正则表达式的一个中央就是测试特别字符。我们不搜刮一切的特别字符,而是查找一般字符的婚配项,比方字母和空格。我们看看它的运转。
DECLARE@intLengthASINTEGER
DECLARE@vchRegularExpressionASVARCHAR(50)
DECLARE@vchSourceStringasVARCHAR(50)
DECLARE@vchSourceString2asVARCHAR(50)
DECLARE@bitHasNoSpecialCharactersasBIT
--初始化变量
SET@vchSourceString=TestoneThisisatest!!
SET@vchSourceString2=TesttwoThisisatest
--我们的正则表达式应当相似于
--[a-zA-Z]{}
--如:[a-zA-Z]{10}...一个十字符的字符串
--取得字符串长度
SET@intLength=LEN(@vchSourceString)
--设置完全的正则表达式
SET@vchRegularExpression=[a-zA-Z]{+
CAST(@intLengthasvarchar)+}
--是不是有任何特别字符
SET@bitHasNoSpecialCharacters=dbo.find_regular_expression(
@vchSourceString,@vchRegularExpression,0)
PRINT@vchSourceString
IF@bitHasNoSpecialCharacters=1BEGIN
PRINTNospecialcharacters.
ENDELSEBEGIN
PRINTSpecialcharactersfound.
END
PRINT---
--取得字符串长度
SET@intLength=LEN(@vchSourceString2)
--设置完全的正则表达式
SET@vchRegularExpression=[a-zA-Z]{+
CAST(@intLengthasvarchar)+}
--是不是有任何特别字符
SET@bitHasNoSpecialCharacters=dbo.find_regular_expression(
@vchSourceString2,@vchRegularExpression,0)
PRINT@vchSourceString2
IF@bitHasNoSpecialCharacters=1BEGIN
PRINTNospecialcharacters.
ENDELSEBEGIN
PRINTSpecialcharactersfound.
END
GO
Theresultsforthisexamplewouldbe:
本例的了局应当是:
TestoneThisisatest!!
Specialcharactersfound.
---
TesttwoThisisatest
Nospecialcharacters.
结论:
正如你所见,这是一个复杂技能,在特定的场所失掉了十分有效的了局。你作为一个T_SQL开辟职员,能够在正则表达式库VBScript.RegExp中利用和扩大这个技能。
提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。 |
|