五维思考

学习要加,骄傲要减,机会要乘,懒惰要除。 http://www.5dthink.cn

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、新建.net类库项目

  1. 创建类库项目,名为MSSQLRegexExtend
  2. 创建一个类,名为RegexExtend
  3. 复制下面代码到类中
using System.Text.RegularExpressions;  
  
namespace MSSQLRegexExtend  
{  
  
    public class RegexExtend  
    {  
        /// <summary>  
        /// 正则匹配  
        /// </summary>  
        /// <param name="regex">正则表达式</param>  
        /// <param name="input">文本</param>  
        /// <returns></returns>  
        [Microsoft.SqlServer.Server.SqlFunction]  
        public static string Match(string regex, string input)  
        {  
            return string.IsNullOrEmpty(input) ? "" : new Regex(regex, RegexOptions.IgnoreCase).Match(input).Value;  
        }  
  
        /// <summary>  
        /// 正则替换  
        /// </summary>  
        /// <param name="regex">正则表达式</param>  
        /// <param name="input">文本</param>  
        /// <param name="replace">要替换的目标</param>  
        /// <returns></returns>  
        [Microsoft.SqlServer.Server.SqlFunction]  
        public static string Replace(string regex, string input, string replace)  
        {  
            return string.IsNullOrEmpty(input) ? "" : new Regex(regex, RegexOptions.IgnoreCase).Replace(input, replace);  
        }  
  
        /// <summary>  
        /// 正则校验  
        /// </summary>  
        /// <param name="regex">正则表达式</param>  
        /// <param name="input">文本</param>  
        /// <returns></returns>  
        [Microsoft.SqlServer.Server.SqlFunction]  
        public static bool IsMatch(string regex, string input)  
        {  
            return !string.IsNullOrEmpty(input) && new Regex(regex, RegexOptions.IgnoreCase).IsMatch(input);  
        }  
    }  
}  

右击项目生成

二、将类库注册到MSSQL中

在数据库中执行如下脚本(类库存放地址得自己修改正确)。

--DROP ASSEMBLY Regex  
CREATE ASSEMBLY Regex from 'E:\CSharp\MSSQLRegexExtend\MSSQLRegexExtend\bin\Release\MSSQLRegexExtend.dll' WITH PERMISSION_SET = SAFE --注册.net类库  
  
sp_configure 'clr enabled', 1   --将数据库设置为可以使用clr组件  
RECONFIGURE         --设置可用clr组件。别忘记运行这行进行应用  
  
/****以下代码将类库中的静态方法注册为函数****/  
  
/****正则匹配****/  
--DROP FUNCTION [dbo].[Regex.Match]  
CREATE FUNCTION [dbo].[Regex.Match](@Regex [nvarchar](max),@Input [nvarchar](max))  
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER  
AS   
EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[Match]  
  
/****正则替换****/  
--DROP FUNCTION [dbo].[Regex.Replace]  
CREATE FUNCTION [dbo].[Regex.Replace](@Regex [nvarchar](max),@Input [nvarchar](max),@Replace [nvarchar](max))  
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER  
AS   
EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[Replace]  
  
/****正则校验****/  
--DROP FUNCTION [dbo].[Regex.IsMatch]  
CREATE FUNCTION [dbo].[Regex.IsMatch](@Regex [nvarchar](max),@Input [nvarchar](max))  
RETURNS [bit] WITH EXECUTE AS CALLER  
AS   
EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[IsMatch]  

三、调用示例

SELECT [CustomerID]  
      ,[CompanyName]  
      ,[ContactName]  
      ,[ContactTitle]  
      ,[City]  
      ,[Region]  
      ,[PostalCode]  
      ,[Country]  
      ,[Phone]  
      ,[Fax]  
      ,[Address]  
      ,[dbo].[Regex.Match]('(\d)+',[Address]) as [门牌号码]     --正则匹配  
      ,[dbo].[Regex.Replace]('\d',[Address],'*') as [将门牌号码打码]   --正则替换  
  FROM [Northwind].[dbo].[Customers]  
  where [dbo].[Regex.IsMatch]('\d',[Address])=1             --正则校验有门牌号码的记录  

posted on 2022-05-14 19:31  五维思考  阅读(1243)  评论(0编辑  收藏  举报

QQ群:1. 全栈码农【346906288】2. VBA/VSTO【2660245】