Just sharing my results from testing.
Id say its not worth implementing a CLR unless you are already using them. In this scenario there are no real performance gains to be had writing custom functions.
NB: regex is overkill for this scenario and it shows in the figures.
--10'000 Row Sample
[squeezeSplitJoin] clr CPU time = 344 ms, elapsed time = 464 ms.
[squeezeReplace] clr CPU time = 406 ms, elapsed time = 476 ms.
Jeff Moden's method CPU time = 437 ms, elapsed time = 520 ms.
[squeezeRegex] clr CPU time = 875 ms, elapsed time = 1143 ms.
George's original CPU time = 953 ms, elapsed time = 1151 ms.
--100'000 Row Sample
[squeezeReplace] clr CPU time = 4172 ms, elapsed time = 5073 ms.
[squeezeSplitJoin] clr CPU time = 4156 ms, elapsed time = 5295 ms.
Jeff Moden's method CPU time = 4281 ms, elapsed time = 5375 ms.
[squeezeRegex] clr CPU time = 8734 ms, elapsed time = 10585 ms.
George's original UDF CPU time = 9516 ms, elapsed time = 17962 ms.
--1'000'000 Row Sample
[squeezeSplitJoin] clr CPU time = 40172 ms, elapsed time = 52232 ms.
Jeff Moden's method CPU time = 40671 ms, elapsed time = 53211 ms.
[squeezeReplace] clr CPU time = 39984 ms, elapsed time = 53694 ms.
[squeezeRegex] clr CPU time = 86609 ms, elapsed time = 111461 ms.
George's original CPU time = 97532 ms, elapsed time = 180209 ms.
Code:
public partial class SqlFunction
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString squeezeRegex(SqlString s)
{
return Regex.Replace(s.ToString(), @"\s+", " ");
}
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString squeezeSplitJoin(SqlString s)
{
return string.Join(" ", s.ToString().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
}
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString squeezeReplace(SqlString s)
{
return s.ToString().Replace(" ", " " + "").Replace("" + " ", "").Replace("", "");
}
}