1

使用 SQL Server 2008,我想在比较数据库值之前对其运行正则表达式。

我正在研究 CLR 用户定义函数(我调查了 EDM 函数,但我觉得 UDF 更适合使用正则表达式 - 如果我错了,请纠正我)。

理想情况下,我想像这样进行 linq 调用:

var results= db.Items.Where(i => i.CustomFormatFunction() == xyz);

到目前为止,我有这个 c# 代码:

public static partial class UserDefinedFunctions
{
    [SqlFunction]
    public static SqlString CustomFormatFunction(string str)
    {
        return Regex.Replace(Regex.Replace(HttpUtility.HtmlDecode(str), @"\s+", "-"), "[^a-zA-Z0-9/-]+", "").ToLower();
    }
}

为了让我能够在 linq 查询中使用它,还需要哪些进一步的步骤?

4

1 回答 1

1

实际上,我前段时间编写了这个确切的函数。我的用途更普遍,但它看起来像这样:

[SqlFunction(DataAccess = DataAccessKind.Read, IsDeterministic = true)]
public static string Replace(string input, string pattern, string replacement, int options)
{
    return Regex.Replace(input, pattern, replacement, (RegexOptions)options);
}

然后你必须在 SQL 中注册它

CREATE ASSEMBLY [MyAssembly] 
FROM 'C:\Path\To\Assembly\MyAssembly.dll'
WITH PERMISSION_SET = SAFE
GO

CREATE FUNCTION [dbo].[Replace](@input [nvarchar](4000), @pattern [nvarchar](4000),  @replacement [nvarchar](4000), @options [int] = 0)
   RETURNS [nvarchar](4000) NULL
   WITH EXECUTE AS CALLER
   AS EXTERNAL NAME [MyAssembly].[MyNamespace.UserDefinedFunctions].[Replace]
GO

这将在 SQL 中创建您的 CLR-UDF。我从未尝试链接linq 查询,但我认为它会像任何其他 EDM 功能一样工作。

[EdmFunction("dbo", "Replace")] 
public static string Replace(Replace input, pattern, replace, int flags) 
{ 
    throw new NotSupportedException("Direct calls not supported"); 
}

甚至可以在同一个方法上放置SqlFunctionEdmFunction属性,但我不推荐它(这似乎也推动了循环的极限)。我更喜欢将我的 CLR-UDF 函数保存在一个完全独立的程序集中,因为它们很少更改,而且我使用数据的程序集非常动态。

于 2013-03-27T22:43:07.523 回答