在 SQL Server 的 T-SQL 中,原生并未提供 regexp_like 或 regexp_replace 这类正则表达式函数,但我们可以通过 CLR 集成或者借助内置字符串函数来弥补这一不足。本文作为上半部分,主要讲解 CLR 方式引入正则表达式的基本原理与简单示例。

为什么 T-SQL 需要正则表达式
业务表中的字段常常包含不规范格式,例如电话号混填、订单号带前缀、日志文本中提取特定码。仅用 like 与 substring 很难覆盖复杂模式,而正则表达式可以用简洁模式描述规则。
通过 CLR 集成使用正则表达式
SQL Server 支持将 dotNet 程序集作为对象引入,这样就能在 T-SQL 中调用 C# 写的正则方法。以下步骤演示创建一个正则匹配函数。
1. 编写 C# 程序集
先在 Visual Studio 中建立类库,暴露静态方法供 SQL 调用。
using System;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
public class RegexFunctions
{
[SqlFunction]
public static bool RegexMatch(string input, string pattern)
{
if (input == null || pattern == null)
return false;
// 使用 dotNet 正则做匹配
return Regex.IsMatch(input, pattern);
}
}
2. 部署到 SQL Server
开启 CLR 并注册程序集,再创建 T-SQL 函数映射。
-- 开启 CLR 集成 sp_configure 'clr enabled', 1; reconfigure; -- 注册程序集(路径按实际修改) create assembly RegexLib from 'C:libsRegexFunctions.dll' with permission_set = safe; -- 创建 T-SQL 函数 create function dbo.RegexMatch(@input nvarchar(max), @pattern nvarchar(max)) returns bit as external name RegexLib.RegexFunctions.RegexMatch;
3. 在查询中使用
现在我们可以像普通函数一样使用正则匹配,比如找出不符合邮箱简单规则的记录。
select Email from Users where dbo.RegexMatch(Email, '^[^@s]+@[^@s]+.[^@s]+$') = 0;
不使用 CLR 的临时方案
如果数据库禁止 CLR,可以用 patindex 与字符串函数组合模拟部分规则。例如提取首位字母:
select substring(col, patindex('%[a-zA-Z]%', col), 1)
from Test;
这种方式能力有限,仅适合简单场景。下一篇文章将讲解用 CLR 实现正则替换与分组提取。