SQL CLR函數(以正則表達式為例)

創建CLR程序集

VS中新建項目,類型為Database,模板選擇SQL Server項目,然後在解決方案資源管理器中,選中項目,右鍵添加,選擇“用戶定義的函數“,然後在類文件中寫入相關代碼,最後生成即可。以下是以正則創建正則表達式相關函數的代碼為例:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
using System.Collections;

public partial class SqlRegularExpressions
{
    // 是否匹配
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean RegExpIsMatch(string input,string pattern)
    {
        return Regex.IsMatch(input, pattern);
    }

    // 第一个匹配的字符串
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString RegExpMatch(string input, string pattern)
    {
        return Regex.Match(input, pattern).Value;
    }

    // 所有匹配的字符串
   [SqlFunction(FillRowMethodName = "FillMatch"
               ,TableDefinition = "[index] int, length int, value nvarchar(4000)")
   ]
    public static IEnumerable RegExpMatches(string input, string pattern)
    {
        return Regex.Matches(input, pattern);
    }

    // 与上面配套的填充函数
    public static void FillMatch(object obj, out int index,out int length, out SqlChars value)
    {
        Match match = (Match)obj;
        index = match.Index;
        length = match.Length;
        value = new SqlChars(match.Value);
    }

    // 正则替换
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString RegExpReplace(string input, string pattern, string replacement)
    {
        return Regex.Replace(input, pattern, replacement);
    }
}

部署CLR函數

可以直接用VS部署(生成->部署),也可以用以下代碼手動創建:
第一步,創建程序集

CREATE ASSEMBLY SqlRegularExpressions 
from 'E:\Study\DotNet\SqlServer_RegExp\bin\Debug\sqlRegExpClass.dll' 
WITH PERMISSION_SET = SAFE
Go

第二步,創建引用程序集的函數

-- Regular Expression Like
CREATE FUNCTION dbo.RegExp_Like
(
    @Input NVARCHAR(MAX),
    @Pattern NVARCHAR(500)
)
RETURNS BIT
AS EXTERNAL NAME 
-- [ASSEMBLY Name].[Class Name].[Function Name]
RegularExpression.SqlRegularExpressions.RegExpIsMatch;
Go

-- First Match Substring
CREATE FUNCTION dbo.RegExp_FirstMatch
(
    @Input NVARCHAR(MAX),
    @Pattern NVARCHAR(500)
)
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME 
RegularExpression.SqlRegularExpressions.RegExpMatch;
Go

-- All Matched Substring
CREATE FUNCTION dbo.RegExp_Matches
(
    @Input NVARCHAR(MAX),
    @Pattern NVARCHAR(500)
)
RETURNS Table([Index] INT,[Length] INT,[Value] NVARCHAR(500))
AS EXTERNAL NAME 
RegularExpression.SqlRegularExpressions.RegExpMatches;
Go

-- Regular Expression Repalce
CREATE FUNCTION dbo.RegExp_Replace
(
    @Input NVARCHAR(MAX),
    @Pattern NVARCHAR(500),
    @Replacement NVARCHAR(500)
)
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME 
RegularExpression.SqlRegularExpressions.RegExpReplace;
GO

使用舉例

-- 是否含有漢字
SELECT dbo.RegExp_Like(N'我是帥哥','[\u4e00-\u9fa5]');

-- 第一個含有字母z的單詞
SELECT dbo.RegExp_FirstMatch('ablaze beagle choral dozen elementary fanatic','\b\w*z+\w*\b');

-- 所有含有字母z的單詞
SELECT * FROM dbo.RegExp_Matches('ablaze beagle choral dozen elementary fanatic','\b\w*z+\w*\b');

運行結果:
運行結果

猜你喜欢

转载自blog.csdn.net/benjayming/article/details/60332993
今日推荐