用于生成slugs的T-SQL函数?

Jer*_*ade 7 t-sql slug

快速检查是否有人知道或知道能够从给定的nvarchar输入生成slug的T-SQL函数.即;

"Hello World">"hello-world"
"这是一个测试">"这是一个测试"

我有一个C#函数,我通常用于这些目的,但在这种情况下,我有大量的数据要解析并变成slug,所以在SQL Server上执行它更有意义,而不是必须传输数据电线.

顺便说一句,我没有远程桌面访问框,所以我不能运行代码(.net,Powershell等)对它

提前致谢.

编辑:根据要求,这是我通常用来生成slugs的函数:

public static string GenerateSlug(string n, int maxLength)
{
    string s = n.ToLower();                
    s = Regex.Replace(s, @"[^a-z0-9s-]", "");              
    s = Regex.Replace(s, @"[s-]+", " ").Trim();             
    s = s.Substring(0, s.Length <= maxLength ? s.Length : maxLength).Trim();             
    s = Regex.Replace(s, @"s", "-"); 
    return s;
}
Run Code Online (Sandbox Code Playgroud)

Ode*_*ded 13

您可以使用LOWERREPLACE执行此操作:

SELECT REPLACE(LOWER(origString), ' ', '-')
FROM myTable
Run Code Online (Sandbox Code Playgroud)

对于列的批量更新(代码slug根据列的值设置origString列:

UPDATE myTable
SET slug = REPLACE(LOWER(origString), ' ', '-')
Run Code Online (Sandbox Code Playgroud)

  • 为了正确地对一个unicode字符串进行强化,你需要的不仅仅是这个.至少应该处理所有非ascii字符. (4认同)

Jer*_*ade 9

这就是我提出的解决方案.随意修复/修改需要的地方.

我应该提一下,我正在开发的数据库是不区分大小写的,因此是LOWER(@str).

CREATE FUNCTION [dbo].[UDF_GenerateSlug]
(   
    @str VARCHAR(100)
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @IncorrectCharLoc SMALLINT
SET @str = LOWER(@str)
SET @IncorrectCharLoc = PATINDEX('%[^0-9a-z ]%',@str)
WHILE @IncorrectCharLoc > 0
BEGIN
SET @str = STUFF(@str,@incorrectCharLoc,1,'')
SET @IncorrectCharLoc = PATINDEX('%[^0-9a-z ]%',@str)
END
SET @str = REPLACE(@str,' ','-')
RETURN @str
END
Run Code Online (Sandbox Code Playgroud)

提及:http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/获取原始代码.

  • 它不应该是`'%[^0-9a-z] %'`而是应该是`'%[^0-9a-z-]%'` (2认同)

Jul*_*ana 5

我知道这是一个旧线程,但对于下一代,我找到了一个甚至可以处理重音的函数

CREATE function [dbo].[slugify](@string varchar(4000)) 
    RETURNS varchar(4000) AS BEGIN 
    declare @out varchar(4000)

    --convert to ASCII
    set @out = lower(@string COLLATE SQL_Latin1_General_CP1251_CS_AS)

    declare @pi int 
    --I'm sorry T-SQL have no regex. Thanks for patindex, MS .. :-)
    set @pi = patindex('%[^a-z0-9 -]%',@out)
    while @pi>0 begin
        set @out = replace(@out, substring(@out,@pi,1), '')
        --set @out = left(@out,@pi-1) + substring(@out,@pi+1,8000)
        set @pi = patindex('%[^a-z0-9 -]%',@out)
    end

    set @out = ltrim(rtrim(@out))

   -- replace space to hyphen   
   set @out = replace(@out, ' ', '-')

   -- remove double hyphen
   while CHARINDEX('--', @out) > 0 set @out = replace(@out, '--', '-')

   return (@out)
END
Run Code Online (Sandbox Code Playgroud)