惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
S
Securelist
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
Martin Fowler
Martin Fowler
量子位
D
Docker
G
Google Developers Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
U
Unit 42
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
NISL@THU
NISL@THU
T
Tailwind CSS Blog
I
Intezer
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
W
WeLiveSecurity
C
Cisco Blogs
Security Latest
Security Latest
PCI Perspectives
PCI Perspectives
L
LangChain Blog
P
Palo Alto Networks Blog
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
Help Net Security
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
Project Zero
Project Zero
G
GRAHAM CLULEY
Recent Commits to openclaw:main
Recent Commits to openclaw:main
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cloudbric
Cloudbric
D
Darknet – Hacking Tools, Hacker News & Cyber Security

博客园 - Sam Lin

中控IFace302考勤机二开内存问题解决方案 DeepSeek R1超强平替方案,再也不担心服务器繁忙了,建议收藏 将DeepSeek接入人类大脑会怎样?? 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版 DeepSeek本地化部署超简单,比装个office还简单 2022年工作总结,迟到比没到好 Scratch教程:第1课认识Scratch SQL技巧:查询某个表关联的所有存储过程 还堵在高速路上吗?带你进入Scratch世界带你飞 抗新型冠状病毒诗 我将要离开,广州! 您还差宝贝一张语文教学光盘!教你如何制作ISO文件 数据采集之登录那些事 潮汕七样羹之情 劣湿为始《清明之冬》 福利预告,跳一跳助手即将发布,您不知道还有这些... 新网云服务导致八爪鱼招标网近一天宕机,提交工单竟谎报问题已修复 首次获得摩拜单车的红包 Win10家庭版中的SQL2005无法远程连接
SQL Server也能玩正则表达式?二开实现比MySQL更强大的文本处理能力
Sam Lin · 2025-08-14 · via 博客园 - Sam Lin

技术背景:最近在搭建数据仓库,需要通过SQL Server对一系列的激光器提取其功率数,以前使用PowerBI可能是比较好实现的,现在使用SQLServer想实现这一功能还真比较困难,如果SQL Server有PostgreSQL、MySQL一样支持正则表达式就好了。本文通过对SQLServer二开实现比MySQL、PostgreSQL还强大的正则表达式功能

一、需求背景

先提个问题,以下表格中请用SQL找出大于等于12000W的记录:

主键 激光器
1 ABC_12200W, 某激光_8000W
2 切割头_600W, 某激光_100W
3 某激光器_99000W

注:是大于等于12000W

二、思考过程

  • MySQL、PostgreSQL支持正则表达式,但研究下来,这两数据库中的正则表达也只能用于模式匹配,无法将匹配后的内容进行比较;换言之,MySQL、PostgreSQL应该无法较好的满足对非结构化内容的数值判断。
  • SQL Server,没有内置的原生正则表达式函数,但可以通过多种方法实现类似功能,如通过C#开发对SQL Server进行功能扩充;

三、实现过程

第一步:开启CLR

EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;

提示:配置选项 'clr enabled' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

第二步:编写C#编程集

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

第三步,在SQL Server中注册程序集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正则表达式函数

/*
Sql Server正则表达式
*/
CREATE FUNCTION f_regex(@input NVARCHAR(MAX), @pattern NVARCHAR(100))
RETURNS BIT
AS EXTERNAL NAME SqlRegex.[SqlRegularExpressions].RegexMatch;

第五步,在SQLServer中应用正式表达式

select dbo.f_regex('锐科_3000W','[0-9]{3,}W') 结果如下所示:

到这里SQLServer已经拥有与MySQL、PostgreSQL数据库一样的原生正则表达式函数了

四、总结

  • 通过CLR集成做SQLServer开发,可以对SQLServer功能进行扩充,让其拥有与MySQL、PostgreSQL等支持正式表达式的功能,甚至更强大的功能
  • 实现步骤:1、开启SQLServer的CLR功能;2、编写并编译C#程序集;3、在SQLServer中注册C#编程集;4、编写SQLServer函数对C#编程集进行调用;
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