如何在SQL Server 2008R2中实现C# ToUrlString扩展方法功能?
嘿,我刚好处理过一模一样的需求——要在SQL Server 2008R2里复刻C#那个ToUrlString扩展方法的逻辑,给你分享两种方案:临时凑数的纯SQL写法,以及长期靠谱的CLR函数方案。
临时解决方案:纯SQL REPLACE 写法
如果你只是临时救急(比如像你说的凌晨疲惫赶工),可以用一堆REPLACE语句先凑合用,核心思路是:
- 转小写
- 替换常见特殊字符(比如&、@之类的)
- 把连续的非单词字符/空格替换成单个
- - 去掉首尾的
-
举个示例代码:
CREATE FUNCTION dbo.ToUrlString_Temp ( @Input NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN IF @Input IS NULL OR @Input = '' RETURN ''; -- 转小写 DECLARE @Result NVARCHAR(MAX) = LOWER(LTRIM(RTRIM(@Input))); -- 替换常见特殊字符 SET @Result = REPLACE(@Result, '&', ''); SET @Result = REPLACE(@Result, '@', ''); SET @Result = REPLACE(@Result, '#', ''); -- 这里可以继续加你需要处理的特殊字符... -- 把所有非字母数字的字符替换成-,然后合并连续的- SET @Result = REPLACE(@Result, ' ', '-'); WHILE CHARINDEX('--', @Result) > 0 SET @Result = REPLACE(@Result, '--', '-'); -- 去掉首尾的- SET @Result = LTRIM(RTRIM(@Result, '-')); RETURN @Result; END
⚠️ 注意:这个方案有局限性,处理不了Unicode变音符号(比如é、ñ这类),而且要手动维护所有特殊字符的替换,长期用很麻烦,只适合临时救急。
推荐方案:SQL CLR 函数实现(和C#逻辑完全一致)
要完美复刻C#的ToUrlString逻辑,最佳方案是创建SQL CLR函数,步骤如下:
1. 编写C#类库代码
创建一个.NET Framework类库项目(因为SQL Server 2008R2支持.NET 3.5),添加以下代码:
using System; using System.Data.SqlTypes; using System.Globalization; using System.Text; using System.Text.RegularExpressions; public class UrlStringConverter { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString ToUrlString(SqlString input) { if (input.IsNull || string.IsNullOrEmpty(input.Value)) return SqlString.Null; string str = input.Value.Trim().ToLowerInvariant().Normalize(NormalizationForm.FormD); var sb = new StringBuilder(); foreach (char t in str) { var uc = CharUnicodeInfo.GetUnicodeCategory(t); if (uc != UnicodeCategory.NonSpacingMark) { sb.Append(t); } } string normalized = sb.ToString().Normalize(NormalizationForm.FormC); string result = Regex.Replace(normalized, @"[\W\s]{1,}", "-").Trim('-'); return new SqlString(result); } }
2. 编译并注册程序集到SQL Server
- 把项目编译成DLL(比如
UrlStringConverter.dll) - 在SQL Server里开启CLR集成(如果没开启的话):
sp_configure 'clr enabled', 1; RECONFIGURE;
- 注册程序集(注意替换成你的DLL路径):
CREATE ASSEMBLY UrlStringConverter FROM 'C:\YourPath\UrlStringConverter.dll' WITH PERMISSION_SET = SAFE;
3. 创建SQL函数调用CLR方法
CREATE FUNCTION dbo.ToUrlString(@Input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS EXTERNAL NAME UrlStringConverter.UrlStringConverter.ToUrlString;
测试验证
现在你可以测试和C#完全一致的效果了:
SELECT dbo.ToUrlString(N'Cups & Saucers'); -- 返回 'cups-saucers' SELECT dbo.ToUrlString(N'Spoon-Style Long Sticks-Set of 4'); -- 返回 'spoonstyle-long-sticksset-of-4'
这个方案完美复刻了C#的逻辑,包括Unicode变音符号的处理(比如把é转换成e),而且一劳永逸,不用再维护一堆REPLACE语句。
内容的提问来源于stack exchange,提问作者Beachphool
相关产品推荐
相关产品推荐

