技术背景:最近在搭建数据仓库,需要通过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

SQL Server也能玩正则表达式?二开实现比MySQL更强大的文本处理能力的更多相关文章

  1. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  2. (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

    二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...

  3. SQL Server 性能优化实战系列(二)

    SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...

  4. SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

    二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...

  5. SQL SERVER 原来还可以这样玩 FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  6. 当SQL Server出现当 MUST_CHANGE 为 ON (开)时

    取消账号强制策略时出现错误 当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关). (Microsoft S ...

  7. sql server 对象资源管理器(二)

    SQL会缓存大量的数据页面,他还会缓存很多其他信息,包括存储过程的执行计划 ,特定用户的安全上下文等 如果这些信息没有在数据库中缓存,SQL都要重新计算一遍,花额外的时间,所以SQLSERVER对内存 ...

  8. SQL SERVER 内存学习系列(二)-DMV查看内存信息

    内存管理在SQL Server中有一个三级结构.底部是内存节点,这是最低级的分配器,用于SQL Server的内存.第二个层次是由内存Clerk组成,这是用来访问内存节点和缓存存储,缓存存储则用于缓存 ...

  9. SQL Server数据库性能优化(二)之 索引优化

    参考文献 http://isky000.com/database/mysql-performance-tuning-index 原文作者是做mysql 优化的     但是我觉得  在索引方面    ...

  10. Python002-操作MSSQL(Microsoft sql server)基础示例(二)

    前文http://www.cnblogs.com/fengpingfan/p/7675291.html,讲述了python操作mssql的步骤.环境创建.常用方法等,本文将实例演示python操作ms ...

随机推荐

  1. C# NativeAOT生成.so 库供Linux下C++调用

    html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...

  2. Vue的初步学习---基础

    VUE 数据都没有!你设置个屁的指令啊 先给数据再设置指令我们需要改变我们的思维 重点关注在数据上数据更新后 数据对应的元素 会同步更新this可以获取被实例化的vue对象的元素下的所有东西 从而拿到 ...

  3. Golang基础笔记三之数组和切片

    本文首发于公众号:Hunter后端 原文链接:Golang基础笔记三之数组和切片 这一篇笔记介绍 Golang 里的数组和切片,以下是本篇笔记目录: 数组定义和初始化 数组属性和相关操作 切片的创建 ...

  4. 「Uniapp」一些常用方法的封装

    弹窗 - showModal /** * 封装 uni.showModal * @param {Object|String} options 配置对象或提示内容 * @param {String} [ ...

  5. ChatGPT学习之旅 (1) 初步了解ChatGPT

    大家好,我是Edison. 之前说过,我们即将开始一段AIGC学习之旅,从ChatGPT到Github Copilot再到Semantic Kernel,第一站是ChatGPT.在这一站,我们花一点时 ...

  6. .NET Core应用如何通过SSL访问MongoDB?

    大家好,我是Edison. 最近有一个ASP.NET Core通过SSL证书访问MongoDB的需求,但是在网上发现资料很少,于是调查了一番,做了如下的笔记,希望对你有用. 背景 在实际场景中,开发环 ...

  7. 《容器化.NET应用架构指南》脑图学习笔记(一)

    一.关于这本官方"圣经" 作为.NET程序员,对于微软官方推动的架构示例总是特别关注,从PetShop到MusicStore再到eShopOnContainers,每一次关注,都会 ...

  8. Oracle中的函数与存储过程

    自定义函数 函数的最大特征是必须返回值 创建自定义函数 创建函数使用create or replace function命令 create or replace function 函数名 return ...

  9. OpenAiTx 帮助 Gitee 项目翻译出海、开拓国际社群

    使用方式: 只需要在 https://openaitx.github.io/ 提交 Gitee 项目 URL 即可 系统会自动为你的项目 Readme, Wiki 生成翻译 20 语言,系统翻译完成后 ...

  10. Luogu P11132 【MX-X5-T4】「GFOI Round 1」epitaxy 题解

    P11132 [MX-X5-T4]「GFOI Round 1」epitaxy 基于次大值的构造. 考虑到如果最大值和次大值都出现那么结果一定为 \(1\).而如果次大值在序列中出现 \(2m-1\) ...