您的位置:首页 > 数据库

在T-SQL中使用正则表达式函数

2010-06-25 17:36 148 查看
有想过在T-Sql使用正则表达式吗?是的,完全可以的,我们可以用SQLSERVERCLRsqlfunction来实现这一功能。
首先,我们在VSTS中创建一DatabaseProject,增一个class,实现下面的一个方法:

///<summary>
///Regstheexmatch.
///</summary>
///<paramname="inputValue">Theinputvalue.</param>
///<paramname="regexPattern">Theregexpattern.</param>
///<remarks>Author:PetterLiuhttp://wintersun.cnblogs.com</remarks>
///<returns>1match,0notmatch</returns>
[SqlFunction]
publicstaticboolRegExMatch(stringinputValue,stringregexPattern)
{
//Anynulls-wecan'tmatch,returnfalse
if(string.IsNullOrEmpty(inputValue)||string.IsNullOrEmpty(regexPattern))
returnfalse;
Regexr1=newRegex(regexPattern.TrimEnd(null));
returnr1.Match(inputValue.TrimEnd(null)).Success;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

好了,Build后Deploy到你的Targetdatabase就OK了,VisualStudio会自动注册这个程序集的。如果,你想手动注册程序集,可执行以下的T-SQL:

CREATEASSEMBLY[RegExCLR]FROM'RegExCLR.dll';
--AddtheREGEXfunction.Wewantafriendlyname
--RegExMatchratherthanthefullnamespacename.
--NotethewaywehavetospecifytheAssembly.Namespace.Class.Function
--NOTEtheRegExCLR.RegExCLR
--(oneistheassemblytheotheristhenamespace)
CREATEFUNCTIONRegExMatch(@inputCalueNVARCHAR(4000),
@regexPatternNVARCHAR(4000))RETURNSBIT
ASEXTERNALNAMERegExCLR.RegExCLR.ClrClass.RegExMatch;

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

OK,一切OK的后,我们来测试下:

selectCOUNT(1)fromThreadswheredbo.RegExMatch(ThreadId,'^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$')=1


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

上面的T-SQL是找出Threads表ThreadId是GUID的记录数。等于1是匹配,^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$匹配GUID的正则表达式。

完了,希望这篇POST对您有帮助。

您可能对以下POST感兴趣:

SQLSERVER2008中CTE的Split与CLR的性能比较

SQLSERVER使用CLRStoredProcedure导出数据到Excel

作者:PetterLiu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-PetterLiuBlog。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: