WEB开发网
开发学院数据库MSSQL Server SQL Server 2005: 正则表达式使模式匹配和数据提取... 阅读

SQL Server 2005: 正则表达式使模式匹配和数据提取变得更容易

 2009-02-10 10:20:07 来源:WEB开发网   
核心提示: select ROUTINE_NAMEfrom INFORMATION_SCHEMA.ROUTINESwhere ROUTINE_TYPE = N'PROCEDURE'and ( LEN( ROUTINE_NAME ) < 11or LEFT( ROUTINE_NAM

select ROUTINE_NAME
from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_TYPE = N'PROCEDURE'
  and ( LEN( ROUTINE_NAME ) < 11
  or LEFT( ROUTINE_NAME, 4 ) <> N'usp_'
  or SUBSTRING( ROUTINE_NAME, 5, 6 ) not in
    ( N'Insert', N'Update', N'Delete', N'Select' ) )

即使代码数量多了,但此查询实际上缺少几项正则表达式版本中包含的功能。首先,它不区分大小写而且在查询中使用排序来执行测试会使其无规则可循。其次,它并未对包含在过程名称中的实际实体名称执行任何测试。第三,问题在于查询中测试的四个字符串的长度均为六个字符,这样我可以通过从六个字符中提取一个子串来简化代码,然后根据每个可接受的操作进行比较。由于所有操作名称的长度均为六个字符,因此该问题并不特定于此示例,但需要构想一个可以指定更复杂动词(例如“Get”、“List”或“Find”)的标准。RegexMatch 函数可以轻松处理这些动词,因为它们恰好是列表中的其他备选方案。

验证是正则表达式的常见用法,可以验证从电话号码到邮政编码以及自定义帐号数字格式的任何内容。CHECK 约束非常适合执行此项操作,如以下所示表定义。

CREATE TABLE [Account]
(
  [AccountNumber] nvarchar(20) CHECK (dbo.RegexMatch(
    [AccountNumber], '^[A-Z]{3,5}d{5}-d{3}$' ) = 1),
  [PhoneNumber] nchar(13) CHECK (dbo.RegexMatch(
    [PhoneNumber], '^(d{3})d{3}-d{4}$' ) = 1),
  [ZipCode] nvarchar(10) CHECK (dbo.RegexMatch(
    [ZipCode], '^d{5}(-d{4})?$' ) = 1)
)

AccountNumber 列是按照满足以下条件的任意约定来验证的,即以三到五个字母开始,后跟五个数字,然后是一个破折号,最后又是三个数字。电话号码和邮政编码都根据标准的美国电话号码和邮政编码格式进行验证。RegexMatch 函数为 SQL Server 提供了许多功能,而 .NET 中的正则表达式实现提供的功能则更多,正如您在下面内容中将看到的一样。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:SQL Server 正则

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接