活着的死人 发表于 2015-1-16 22:29:14

MSSQL编程:T-SQL中的正则表达式

根据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

--我们的正则表达式应当相似于
--{}
--如:{10}...一个十字符的字符串

--取得字符串长度
SET@intLength=LEN(@vchSourceString)

--设置完全的正则表达式
SET@vchRegularExpression={+
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={+
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方面有一定的造诣,你少不了需要看很多很多的书籍了。

因胸联盟 发表于 2015-2-6 13:59:46

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐

海妖 发表于 2015-2-16 09:51:01

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.

简单生活 发表于 2015-3-5 04:13:50

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

只想知道 发表于 2015-3-11 23:29:31

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

admin 发表于 2015-3-19 16:06:20

备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。

柔情似水 发表于 2015-3-29 02:08:24

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
页: [1]
查看完整版本: MSSQL编程:T-SQL中的正则表达式