T-SQL中的正则表达式

原创 2004年01月20日 21:02:00

T-SQL中的正则表达式


原作者:Cory Koski
发表时间:2003/06/24


        本文来自Cory Koski。Cory写道:“我最近遇到一个问题,就是试图在数据库域中搜索一个正则表达式。还没有一个版本的SQLServer内部支持正则表达式,但我发现了一个将正则表达式的所有优点添加到你的T_SQL应用的方法。为了更容易的使用正则表达式,我们可以使用自定义函数(User Defined Function, UDF)来帮助我们并使工作简洁。”

在这个解决方案中,我们需要SQL Server 2000或更高。我们还需要确定机器中有VBScript.RegExp类库,这随大多数Windows 2000 servers中的Windows Scripting包配有。若你正在使用一个更早版本的Windows,你必须为你的操作系统下载最新版的Windows Scripting。
自定义函数
下面是我的自定义函数,可用来在源字符串中搜索一个正则模式表达式。
CREATE FUNCTION dbo.find_regular_expression
 (
  @source varchar(5000),
  @regexp varchar(1000),
  @ignorecase bit = 0
 )
RETURNS bit
AS
 BEGIN
  DECLARE @hr integer
  DECLARE @objRegExp integer
  DECLARE @objMatches integer
  DECLARE @objMatch integer
  DECLARE @count integer
  DECLARE @results bit
  
  EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END 
  EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OADestroy @objRegExp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
 RETURN @results
 END

将这个UDF保存到你的数据库中,并确定有授权来运行它。当然,你也得确保运行它的人有运行sp_OAxxxxx类扩展存储过程的权限。
这个函数已确保正常运行,并且即便是和COM对象一起使用,也还是挺快的。

举例
使用正则表达式的一个地方就是测试特殊字符。我们不搜索所有的特殊字符,而是查找正常字符的匹配项,例如字母和空格。我们看看它的运行。
DECLARE @intLength AS INTEGER
DECLARE @vchRegularExpression AS VARCHAR(50)
DECLARE @vchSourceString as VARCHAR(50)
DECLARE @vchSourceString2 as VARCHAR(50)
DECLARE @bitHasNoSpecialCharacters as BIT

-- 初始化变量
SET @vchSourceString = 'Test one This is a test!!'
SET @vchSourceString2 = 'Test two This is a test'

-- 我们的正则表达式应该类似于
-- [a-zA-Z ]{}
-- 如: [a-zA-Z ]{10}  ...  一个十字符的字符串

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

-- 设置完整的正则表达式
SET @vchRegularExpression = '[a-zA-Z ]{' +
CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(
@vchSourceString, @vchRegularExpression,0)

PRINT @vchSourceString
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

PRINT '---'

-- 获得字符串长度
SET @intLength = LEN(@vchSourceString2)

-- 设置完整的正则表达式
SET @vchRegularExpression = '[a-zA-Z ]{' +
CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(
@vchSourceString2, @vchRegularExpression,0)

PRINT @vchSourceString2
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

GO
The results for this example would be:
本例的结果应该是:
Test one This is a test!!
Special characters found.
---
Test two This is a test
No special characters.

结论:
正如你所见,这是一个简单技巧,在特定的场合得到了非常有用的结果。你作为一个T_SQL开发人员,可以在正则表达式库VBScript.RegExp中使用和扩展这个技巧。

SQL和T-SQL的区别

今天看了看以前的笔记,但是感觉好陌生,只想到当时看耿建玲视频的时候经常听到T-SQL和SQL,所以又百度了一遍,有了更加深入的了解,现在和大家分享一下。           首先来看看百度上是怎么说...
  • lxd8731247769
  • lxd8731247769
  • 2015年07月18日 16:32
  • 2748

T-SQL和MySQL的一些常用语法的区别

本文将主要列出MySql与SqlServer的SQL语句的一些常用语法的不同之处,且以常用的存储过程的相关内容为主。   1. 标识符限定符   SqlServer ...
  • Andrewniu
  • Andrewniu
  • 2016年12月09日 08:16
  • 1013

T-SQL 语句(九)—— 游标

T-SQL 语句(九)—— 游标一、游标简介  游标主要用于 T-SQL 批、存储过程以及触发器当中,其作用是存储一个结果集,并能通过循环将这个结果集里的数据一条条取出来进行处理。使用游标处理结果集的...
  • wuxinwudai
  • wuxinwudai
  • 2017年02月14日 02:02
  • 546

T-SQL基础教程:SQL Server的ABC特色

作者:Itzik Ben-Gan图书:http://item.jd.com/11362891.html多年来,SQL Server只有一个特色——盒子,或是称为(企业)内部部署。最近,微软决定提供多种...
  • zhanghongju
  • zhanghongju
  • 2014年02月16日 09:45
  • 2120

T-SQL 语句(五) —— 存储过程

T-SQL 语句(五) —— 存储过程一、存储过程简介1、存储过程:一组预先写好的能实现某种功能的T-SQL 程序,指定一个程序名后编译后并将其存在SQL Server 中,以后要实现该功能可调用这个...
  • wuxinwudai
  • wuxinwudai
  • 2017年02月12日 04:42
  • 695

T_SQL总结笔记

T_SQL总结笔记 一 基本语法 新建数据库 插入数据insert 修改数据记录Update 删除 1Delete记录日志 2清空删除Truncate不记录日志 3删除表drop表和日志都删除 二运算...
  • YLBF_DEV
  • YLBF_DEV
  • 2015年06月27日 17:10
  • 421

T-SQL | 如何实现聚类连接字符串

在数据库查找的过程中,我们可以通过聚类函数,如SUM,AVERAGE,COUNT对结果进行聚类。但是SQL Server本身没有提供对字符串连接的聚类函数。因此,本文找到了一种方法去完成字符串连接的聚...
  • lanxu_yy
  • lanxu_yy
  • 2013年12月16日 13:21
  • 3246

如何在T-sql 中实现数组的功能

T-SQL象数组一样处理字符串、分割字符串    在日常的编程过程中,数组是要经常使用到的。在利用SQL对数据库进行操作时,有时就想在SQL使用数组,比如将1,2,3,4,5拆分成数组。可惜的是在T-...
  • huangtao2011
  • huangtao2011
  • 2014年07月04日 16:47
  • 1971

T-SQL视图操作

视图:是从一个或多个表中使用SELECT的FROM子句导出的。那些用来导出视图的表称为基表,视图也可以从一个或多个其他视图中产生。导出视图的SE LECT语句存放在数据库中,而与视图定义相关的数据并没...
  • qq719365064
  • qq719365064
  • 2016年10月25日 17:44
  • 69

T-SQL常用数据库操作语句

1、DDL ,包括新建、修改、删除【表、视图 、存储过程 、函数 】,其中修改表结构包括添加删除修改列 。 2、DML,包括表格记录的增删查该操作,内、外连接的写法及作用;子查询(in、Exists)...
  • Illusion_1202
  • Illusion_1202
  • 2016年07月21日 17:35
  • 713
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:T-SQL中的正则表达式
举报原因:
原因补充:

(最多只允许输入30个字)