

























技术背景:最近在搭建数据仓库,需要通过SQL Server对一系列的激光器提取其功率数,以前使用PowerBI可能是比较好实现的,现在使用SQLServer想实现这一功能还真比较困难,如果SQL Server有PostgreSQL、MySQL一样支持正则表达式就好了。本文通过对SQLServer二开实现比MySQL、PostgreSQL还强大的正则表达式功能
先提个问题,以下表格中请用SQL找出大于等于12000W的记录:
| 主键 | 激光器 |
|---|---|
| 1 | ABC_12200W, 某激光_8000W |
| 2 | 切割头_600W, 某激光_100W |
| 3 | 某激光器_99000W |
注:是大于等于12000W
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
提示:配置选项 'clr enabled' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server; /// <summary>
/// SQL Server扩展函数
/// </summary>
public class SqlRegularExpressions
{
[SqlFunction]
public static SqlBoolean RegexMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull)
return false;
return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnoreCase);
}
}
生成SqlServerEx.dll
CREATE ASSEMBLY SqlRegex FROM 'D:\tmp\SqlServerEx\SqlServerEx\bin\Debug\SqlServerEx.dll' WITH PERMISSION_SET = SAFE;
注:可能会提示注册失败,如
针对带有 SAFE 或 EXTERNAL_ACCESS 选项的程序集“SqlServerEx”的 CREATE 或 ALTER ASSEMBLY 失败,因为 sp_configure 的“CLR 严格安全性”选项设置为 1。Microsoft 建议使用其相应登录名具有 UNSAFE ASSEMBLY 权限的证书或非对称密钥为该程序集签名。或者,也可以使用 sp_add_trusted_assembly 信任程序集。
这时需要启用CLR安全设置:
ALTER DATABASE DW SET TRUSTWORTHY ON;
/*
Sql Server正则表达式
*/
CREATE FUNCTION f_regex(@input NVARCHAR(MAX), @pattern NVARCHAR(100))
RETURNS BIT
AS EXTERNAL NAME SqlRegex.[SqlRegularExpressions].RegexMatch;
select dbo.f_regex('锐科_3000W','[0-9]{3,}W')
结果如下所示:

到这里SQLServer已经拥有与MySQL、PostgreSQL数据库一样的原生正则表达式函数了
graph TD
A[开启SQLServer的CLR功能] --> B[编写并编译C#程序集]
B --> C[在SQLServer中注册C#程序集]
C --> D[编写SQLServer函数对C#程序集进行调用]
case when dbo.f_regex_int('锐科_3000W','[0-9]{3,}W')>12000 then '高功率' else '低功率' end
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。