【问题标题】:Regex for a serial number in T-SQLT-SQL 中序列号的正则表达式
【发布时间】:2011-04-28 18:16:51
【问题描述】:

我是正则表达式的新手,目前正在尝试提出一个简单的正则表达式来搜索以下格式的序列号:0217103200XX,其中“XX”每个都可以是数字数字。我正在使用 SQL Server Management Studio 将正则表达式作为存储过程中的参数传递。我不确定语法是否与其他编程语言有任何不同。我有以下正则表达式作为参考: (?:2328\d\d(?:0[1-9]|[1-4]\d|5[0-3])\d{4})

欢迎提出任何建议。

更新: 我实际上是在 SQL 查询中使用它,而不是在 .Net 应用程序中。格式如下:

USE [MyDB]

EXEC MyStoredProcedure @regex = '(?:2328\d\d(?:0[1-9]|[1-4]\d|5[0-3])\d{4})'

【问题讨论】:

  • SQL Server 没有本地正则表达式支持 - 您需要创建一个 SQLCLR 程序集才能通过 .NET 公开功能。
  • @OMG:还有 xp_pcre(请参阅我的 old answer)。现在可能有点过时了,但在我们的一台服务器上运行良好。
  • @Tomalak:很酷,但它不是原生的
  • @OMG Ponies:嗯,这取决于你如何定义“原生”。通过外部 DLL 绑定的扩展存储过程非常“原生”于 SQL 服务器。 ;-)
  • @Tomalak:基本上,SQLCLR 也是如此。 “原生”对我来说意味着立即可用,不需要我创建东西、加载程序集/创建 SP 等,然后我就可以做我需要做的事情。

标签: sql-server regex sql-server-2005 tsql ssms


【解决方案1】:

使用 LIKE:SQL Server 中没有本机 RegEx

LIKE '0217103200[0-9][0-9]'

【讨论】:

    【解决方案2】:

    正如 OMG Ponies 所说 - SQL Server 本身不支持正则表达式(需要在 2005+ 或 xp_cre 中使用 SQLCLR)。

    如果我理解了您的问题,您可以使用PATINDEX 查找序列号

    Select *
    From dbo.MyTable
    Where PATINDEX('0217103200[0-9][0-9]', SerialNumberColumn) > 0
    

    【讨论】:

    • @gbn - 没有任何理由,我只是喜欢使用 PATINDEX。必须是括号或其他东西;-)
    • 感谢您的启发。我对 SQL Server 不够熟悉,不知道是否支持 RegEx。查看存储过程后,看起来正则表达式参数只是被插入到数据库中以供参考。
    猜你喜欢
    • 2010-09-16
    • 2011-03-16
    • 2015-10-12
    • 2022-11-05
    • 1970-01-01
    • 2022-08-03
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多