C# 字符串函数到 T-SQL 标量函数

Posted

技术标签:

【中文标题】C# 字符串函数到 T-SQL 标量函数【英文标题】:C# string function to T-SQL scalar function 【发布时间】:2011-07-13 11:22:11 【问题描述】:

我想使用一个 c# 函数来修改 html 有效 url 名称的字符串。函数如下:

public static string HTMLValidName(string input)

    string[] pattern = new string[]  "[^a-zA-Z0-9-]", "-+" ;
    string[] replacements = new string[]  "-", "-" ;
    input = input.Trim();
    input = input.Replace("Ç", "C");
    input = input.Replace("ç", "c");
    input = input.Replace("Ğ", "G");
    input = input.Replace("ğ", "g");
    input = input.Replace("Ü", "U");
    input = input.Replace("ü", "u");
    input = input.Replace("Ş", "S");
    input = input.Replace("ş", "s");
    input = input.Replace("İ", "I");
    input = input.Replace("ı", "i");
    input = input.Replace("Ö", "O");
    input = input.Replace("ö", "o");
    for (int i = 0; i <= pattern.Length - 1; i++)
        input = Regex.Replace(input, pattern[i], replacements[i]);

    while(input.Contains("--"))
    
        input = input.Replace("--", "-");
    

    if (input[0] == '-') input = input.Substring(1, input.Length - 1);

    return input;

我需要将此函数用于 SQL 结果。喜欢 SELECT ID FROM Categories WHERE HTMLValidName(Title)=@URLTitle

如何将其转换为 T-SQL 函数或在 c# 中创建此函数?

【问题讨论】:

【参考方案1】:
CREATE FUNCTION dbo.HtmlValidName(@input nvarchar(max))
    RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @i int
    DECLARE @match int

    -- Remove diacritical marks
    SET @input = CAST(@input AS varchar(max)) COLLATE Japanese_BIN

    -- Replace non-alphanumerics with dash
    SET @i = 0
    WHILE @i < 1000000
    BEGIN
        SET @match = PATINDEX('%[^a-zA-Z0-9-]%', @input)
        IF @match = 0 BREAK
        SET @input = STUFF(@input, @match, 1, '-')
        SET @i = @i + 1
    END

    RETURN @input
END

【讨论】:

【参考方案2】:

您可以创建一个托管的用户定义函数,该函数在您的 SQL 服务器中运行,并且从外部看起来就像一个普通的用户定义函数。请参阅here 了解更多信息。

【讨论】:

以上是关于C# 字符串函数到 T-SQL 标量函数的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL编程 —— 用户自定义函数(标量函数)

在 C# 中调用标量函数 [重复]

从 TSQL 标量函数返回连接值

在多标量表值函数中调用存储过程?

T-SQL编程 —— 用户自定义函数(内嵌表值函数)

使用声明的变量创建标量函数