首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

T-SQL 正则表达式(CLR 实现),该怎么解决

2012-01-31 
T-SQL 正则表达式(CLR 实现)创建程序集 ClrRegExClass.cs,并使用 C:\Windows\Microsoft.NET\Framework\v2.

T-SQL 正则表达式(CLR 实现)
创建程序集 ClrRegExClass.cs,
并使用 C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library ClrRegExClass.cs 编译为 ClrRegExClass.DLL 文件。

C# code
using System;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;using System.Text.RegularExpressions;public partial class RegExp{// 验证字符串中是否包含与指定的匹配模式一致的字符串    [SqlFunction(IsDeterministic = true, IsPrecise = true)]    public static SqlBoolean RegExIsMatch(SqlString expression, SqlString pattern)    {        return new SqlBoolean(Regex.IsMatch(expression.ToString(), pattern.ToString()));    }// 替换字符串中与指定的匹配模式一致的字符串    [SqlFunction(IsDeterministic = true, IsPrecise = true)]    public static SqlString RegExReplace(SqlString expression, SqlString pattern, SqlString replacement)    {        return new SqlString(Regex.Replace(expression.ToString(), pattern.ToString(), replacement.ToString()));    }// 提取字符串中与指定的匹配模式一致的字符串    [SqlFunction(IsDeterministic = true, IsPrecise = true)]    public static SqlString RegExSubstring(SqlString expression, SqlString pattern, SqlInt32 position, SqlInt32 occurrence)    {        if (expression.ToString().Length < position) return new SqlString("");        if (position <= 0) position = 1;        if (occurrence <= 0) occurrence = 1;        Match m = Regex.Match(expression.ToString().Substring((int) position - 1),pattern.ToString());        for (int i = 1; i < (int)occurrence; i++)        {            m = m.NextMatch();            if (!m.Success) return new SqlString("");        }        return new SqlString(m.ToString());    }// 计算字符串中与指定的匹配模式一致的字符串的数目    [SqlFunction(IsDeterministic = true, IsPrecise = true)]    public static SqlInt32 RegExCount(SqlString expression, SqlString pattern, SqlInt32 position)    {        if (expression.ToString().Length < position) return 0;        if (position <= 0) position = 1;        MatchCollection ms = Regex.Matches(expression.ToString().Substring((int)position - 1), pattern.ToString());        return new SqlInt32(ms.Count);    }// 查找字符串中与指定的匹配模式一致的字符串的位置    [SqlFunction(IsDeterministic = true, IsPrecise = true)]    public static SqlInt32 RegExIndex(SqlString expression, SqlString pattern, SqlInt32 position, SqlInt32 occurrence)    {        if (expression.ToString().Length < position) return 0;        if (position <= 0) position = 1;        if (occurrence <= 0) occurrence = 1;        Match m = Regex.Match(expression.ToString().Substring((int)position - 1), pattern.ToString());        for (int i = 1; i < (int)occurrence; i++)        {            m = m.NextMatch();            if (!m.Success) return 0;        }        return new SqlInt32(m.Index + 1);    }}


将程序集 ClrRegExClass.DLL 导入 SQL Server,并创建相应的函数。
SQL code
// 启用 SQL Server 的 CLR 支持exec sp_configure 'clr enabled',1;goreconfigurego// 导入程序集if exists (select * from sys.assemblies where name='RegExp') drop assembly RegExp;gocreate assembly RegExp authorization dbofrom 'fullpath\ClrRegExClass.dll'with permission_set=safe;go// 创建函数// @expression 为输入的字符串;@pattern 为正则表达式;// @position 为字符串开始的位置;@occurrence 为与指定的匹配模式一致的字符串出现的次数if object_id('dbo.regex_ismatch','FS') is not null drop function dbo.regex_ismatch;gocreate function dbo.regex_ismatch(@expression nvarchar(max), @pattern nvarchar(max))returns bit with returns null on null inputas external name RegExp.RegExp.RegExIsMatch;go-- 验证字符串是否以 [server] 开头-- select dbo.regex_ismatch('[server].[database].[schema].[object]','^\[server\]');if object_id('dbo.regex_replace','FS') is not null drop function dbo.regex_replace;gocreate function dbo.regex_replace(@expression nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max))returns nvarchar(max) with returns null on null inputas external name RegExp.RegExp.RegExReplace;go-- 将字符串中 [...] 替换为 "..."-- select dbo.regex_replace('[server].[database].[schema].[object]','\[([\w]*)\]','"$1"');if object_id('dbo.regex_substring','FS') is not null drop function dbo.regex_substring;gocreate function dbo.regex_substring(@expression nvarchar(max), @pattern nvarchar(max), @position int, @occurrence int)returns nvarchar(max) with returns null on null inputas external name RegExp.RegExp.RegExSubstring;go-- 提取字符串中与 [...] 模式匹配的第二次出现的字符串-- select dbo.regex_substring('[server].[database].[schema].[object]','\[\w*\]',1,2);if object_id('dbo.regex_count','FS') is not null drop function dbo.regex_count;gocreate function dbo.regex_count(@expression nvarchar(max), @pattern nvarchar(max), @position int)returns int with returns null on null inputas external name RegExp.RegExp.RegExCount;go-- 计算字符串中与 [...] 模式匹配的字符串的数目-- select dbo.regex_count('[server].[database].[schema].[object]','\[\w*\]',1);if object_id('dbo.regex_index','FS') is not null drop function dbo.regex_index;gocreate function dbo.regex_index(@expression nvarchar(max), @pattern nvarchar(max), @position int, @occurrence int)returns int with returns null on null inputas external name RegExp.RegExp.RegExIndex;go-- 查询字符串中与 [...] 模式匹配的第二次出现的字符串开始的位置-- select dbo.regex_index('[server].[database].[schema].[object]','\[\w*\]',1,2); 



(希望大家指正)

[解决办法]
up.
[解决办法]
学习。。
[解决办法]
支持.
[解决办法]
ding.
[解决办法]
射京。。。


[解决办法]
学习。
[解决办法]
学习。
[解决办法]
帮顶,学习!!
[解决办法]
支持,学习.
[解决办法]
jf
[解决办法]

。。
[解决办法]
猫是高手。
[解决办法]
看不懂,先留着
[解决办法]
接分来得
[解决办法]
多谢分享。
[解决办法]
学习!
[解决办法]
学下!!!
[解决办法]
看不懂,CLR从未用过 留着
[解决办法]
看不懂,CLR从未用过 留着
[解决办法]
菜鸟学习了
[解决办法]
很详细呀!
[解决办法]

[解决办法]
每天回帖即可获得10分可用分!
[解决办法]
不懂

貌似强大
[解决办法]
新人进来学习 谢谢达人们的指教了
[解决办法]
学习了!!
[解决办法]
学习 怎么接分 哈哈
[解决办法]
支持,学习.
[解决办法]
收藏 。
[解决办法]
mark
[解决办法]
good,That's ok!
[解决办法]
支持~学习学习!
[解决办法]

[解决办法]
学习了……顶
[解决办法]
先mark,以后学习用。


[解决办法]
====================================
[解决办法]
支持~学习学习!
[解决办法]
up.
[解决办法]
看起来很强大
[解决办法]
不错,支持!
[解决办法]
继续学习!!!
[解决办法]
号东西 呵呵
[解决办法]
那个sql 语句有疑问,写出来。
太多了。

[解决办法]
正找呢
[解决办法]
必须顶啊, 好东西
[解决办法]
好东西,收藏
[解决办法]
支持......
[解决办法]
支持......
[解决办法]
学习,接分
[解决办法]
学习了
[解决办法]
UP~UP~~
[解决办法]
学习了。。。
[解决办法]
学习。。
[解决办法]
学习...
[解决办法]
保留!!!!!!!!!!!!!!!!!!
[解决办法]
牛逼 ,留着
[解决办法]
膜拜啊。
[解决办法]
好东西啊!收下了!
[解决办法]
mark CLR不是很熟。
[解决办法]
ok 
bucuo

[解决办法]

[解决办法]
支持!
[解决办法]
不太懂,慢慢研究
[解决办法]
学习,无敌了
[解决办法]
原来.NET和SQL可以这样用...不错,赞一个...!
[解决办法]
2323242424532523532好
[解决办法]
不懂

貌似强大 
 

[解决办法]
xuexi
[解决办法]
学习,我是搞java的,相似
------解决方案--------------------



[解决办法]
xiexie!
[解决办法]
很好,很强大

[解决办法]
顶,做得相当好
[解决办法]
哇靠 出精品了 ·



[解决办法]
顶起啊
[解决办法]
很不错,先占位留着
[解决办法]
完全不懂
[解决办法]

[解决办法]
ggggggggggggggggggggggggggggggggggggggggggggggg
[解决办法]
学习。。
[解决办法]
强悍。。
[解决办法]
顶就一个字而已
[解决办法]
好!值得学习
[解决办法]
顶一个!!
[解决办法]
学习。。。
[解决办法]
学习了
[解决办法]
这是什么东西
[解决办法]
支持一下 顶一下
[解决办法]
gjj df f
[解决办法]
支持一下 顶一下
[解决办法]
顶一下吧,嘻嘻,很新了



藏头诗软件
星座配对指数测试
网络电话 免费
免费艺术签名设计
免费八字配对算命
好听搞笑的铃声
[解决办法]
不了解,支持
[解决办法]
学习了
[解决办法]
好,顶一个
[解决办法]
asdftgyhujkl;
[解决办法]
up~
学习中。。。
[解决办法]
学习了!!!!!!!!!11

热点排行