仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3391|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL编程:T-SQL中的正则表达式

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:29:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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等都可以用作数据表名和数据列名。
沙发
发表于 2015-1-17 23:32:25 来自手机 | 只看该作者
入门没那么困难,精通没那么容易
再现理想 该用户已被删除
板凳
发表于 2015-1-21 10:56:40 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
金色的骷髅 该用户已被删除
地板
发表于 2015-1-30 16:08:09 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
因胸联盟 该用户已被删除
5#
发表于 2015-2-6 13:59:46 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
海妖 该用户已被删除
6#
发表于 2015-2-16 09:51:01 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
简单生活 该用户已被删除
7#
发表于 2015-3-5 04:13:50 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
只想知道 该用户已被删除
8#
发表于 2015-3-11 23:29:31 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
admin 该用户已被删除
9#
发表于 2015-3-19 16:06:20 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
柔情似水 该用户已被删除
10#
发表于 2015-3-29 02:08:24 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-20 00:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表