技术背景:最近在搭建数据仓库,需要通过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. 数栈产品分享:简析数据中台如何通过DataAPI实现数据共享

    数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...

  2. 高性能、高扩展、高稳定:解读 EasyMR 大数据组件自定义可扩展能力

    随着互联网技术的不断发展以及大数据时代的兴起,企业对于数据分析和洞察的需求日益增长.大多数企业都积累了大量的数据,需要从这些数据中快速灵活地提取有价值的信息,以便为用户提供更好的服务或者帮助企业做出更 ...

  3. MD-ML: Super Fast Privacy-Preserving Machine Learning for Malicious Security with a Dishonest Majority

    这是上交团队发表在USENIX2024上的文章. 1 介绍 1.1 \(\text{MPC}\)和\(\text{PPML}\) 假设一个多方的场景,参与方分别持有数据\(x,y,z,w\),如果现在 ...

  4. 英文单词字母大小写在线转换工具html代码

    这是一个简单而实用的在线大小写转换工具.它允许用户输入任意文本,并提供三种转换选项:转换为全大写.全小写或首字母大写. 使用这个工具非常简单快捷.用户只需要在输入框中输入想要转换的文本,选择合适的转换 ...

  5. javascript中IIFE(立即执行函数表达式)到底是咋来的?

    介绍 IIFE(Immediately Invoked Function Expression),中文名称:立即执行函数表达式,其实IIFE最早并不叫这个名字,而是叫做Self-Executing A ...

  6. MySQL的三大日志

    前言 飞机失事靠黑匣子还原真相,MySQL崩溃靠三大日志保障数据安全. 作为一个工作多年的程序员,我见过太多因日志配置不当引发的灾难:数据丢失.主从同步中断.事务回滚失败... 今天,我将用最通俗的方 ...

  7. 前端开发系列011-基础篇之JavaScript对象介绍

    本文简单介绍JavaScript语言中的Object对象类型,包括但不限于对象的结构.核心概念.类型检查.创建对象的方式以及对象的常用操作等内容. 一.对象简单介绍 javaScript是一门基于弱类 ...

  8. AtCoder Beginner Contest 214 ABCDE 题解

    A - New Generation ABC 思路:分段讨论 view code #include<iostream> #include<string> #include< ...

  9. phong模型和blinnphong模型简述

    简介 phong 和 blinnphong 都是比较常用的光照模型 参考链接 https://github.com/Richbabe/Phong-BlinnPhong_Unity 非常好讲的 http ...

  10. 堆排序 使用 algorithm

    简介 show code code #include <set> #include <vector> #include <list> #include <io ...