1. 程式人生 > >SQLserver中使用正則表達式

SQLserver中使用正則表達式

tro max dll count 組件 too 可用 mat comm

一、新建.net類庫項目

  1. 創建類庫項目,名為MSSQLRegexExtend
  2. 創建一個類,名為RegexExtend
  3. 復制下面代碼到類中 [csharp] view plain copy
    1. using System.Text.RegularExpressions;
    2. namespace MSSQLRegexExtend
    3. {
    4. public class RegexExtend
    5. {
    6. /// <summary>
    7. /// 正則匹配
    8. /// </summary>
    9. /// <param name="regex">正則表達式</param>
    10. /// <param name="input">文本</param>
    11. /// <returns></returns>
    12. [Microsoft.SqlServer.Server.SqlFunction]
    13. public static string Match(string regex, string input)
    14. {
    15. return string.IsNullOrEmpty(input) ? "" : new Regex(regex, RegexOptions.IgnoreCase).Match(input).Value;
    16. }
    17. /// <summary>
    18. /// 正則替換
    19. /// </summary>
    20. /// <param name="regex">正則表達式</param>
    21. /// <param name="input">文本</param>
    22. /// <param name="replace">要替換的目標</param>
    23. /// <returns></returns>
    24. [Microsoft.SqlServer.Server.SqlFunction]
    25. public static string Replace(string regex, string input, string replace)
    26. {
    27. return string.IsNullOrEmpty(input) ? "" : new Regex(regex, RegexOptions.IgnoreCase).Replace(input, replace);
    28. }
    29. /// <summary>
    30. /// 正則校驗
    31. /// </summary>
    32. /// <param name="regex">正則表達式</param>
    33. /// <param name="input">文本</param>
    34. /// <returns></returns>
    35. [Microsoft.SqlServer.Server.SqlFunction]
    36. public static bool IsMatch(string regex, string input)
    37. {
    38. return !string.IsNullOrEmpty(input) && new Regex(regex, RegexOptions.IgnoreCase).IsMatch(input);
    39. }
    40. }
    41. }
  4. 右擊項目生成

二、將類庫註冊到MSSQL中

在數據庫中執行如下腳本(類庫存放地址得自己修改正確)。

[sql] view plain copy
  1. --DROP ASSEMBLY Regex
  2. CREATE ASSEMBLY Regex from ‘E:\CSharp\MSSQLRegexExtend\MSSQLRegexExtend\bin\Release\MSSQLRegexExtend.dll‘ WITH PERMISSION_SET = SAFE --註冊.net類庫
  3. sp_configure ‘clr enabled‘, 1 --將數據庫設置為可以使用clr組件
  4. RECONFIGURE --設置可用clr組件。別忘記運行這行進行應用
  5. /****以下代碼將類庫中的靜態方法註冊為函數****/
  6. /****正則匹配****/
  7. --DROP FUNCTION [dbo].[Regex.Match]
  8. CREATE FUNCTION [dbo].[Regex.Match](@Regex [nvarchar](max),@Input [nvarchar](max))
  9. RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
  10. AS
  11. EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[Match]
  12. /****正則替換****/
  13. --DROP FUNCTION [dbo].[Regex.Replace]
  14. CREATE FUNCTION [dbo].[Regex.Replace](@Regex [nvarchar](max),@Input [nvarchar](max),@Replace [nvarchar](max))
  15. RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
  16. AS
  17. EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[Replace]
  18. /****正則校驗****/
  19. --DROP FUNCTION [dbo].[Regex.IsMatch]
  20. CREATE FUNCTION [dbo].[Regex.IsMatch](@Regex [nvarchar](max),@Input [nvarchar](max))
  21. RETURNS [bit] WITH EXECUTE AS CALLER
  22. AS
  23. EXTERNAL NAME [Regex].[MSSQLRegexExtend.RegexExtend].[IsMatch]

三、調用示例

[sql] view plain copy
  1. SELECT [CustomerID]
  2. ,[CompanyName]
  3. ,[ContactName]
  4. ,[ContactTitle]
  5. ,[City]
  6. ,[Region]
  7. ,[PostalCode]
  8. ,[Country]
  9. ,[Phone]
  10. ,[Fax]
  11. ,[Address]
  12. ,[dbo].[Regex.Match](‘(\d)+‘,[Address]) as [門牌號碼] --正則匹配
  13. ,[dbo].[Regex.Replace](‘\d‘,[Address],‘*‘) as [將門牌號碼打碼] --正則替換
  14. FROM [Northwind].[dbo].[Customers]
  15. where [dbo].[Regex.IsMatch](‘\d‘,[Address])=1 --正則校驗有門牌號碼的記錄

技術分享

SQLserver中使用正則表達式