使用SQL Server 2008 R2 - 2016.我继承了一个我们用来制作友好网址的功能 - 即多个字符替换。我刚刚打开它,代码似乎并不是最佳的#34;。
它有效,而且这里的所有东西都有充分的理由在那里,虽然有些替换看起来有点奇怪。我想知道是否有更有效的选择来实施重复的替换。
我知道你可以把它们一个嵌入另一个里面,但是这个许多替代品会像罪一样丑陋。我可以把它们推到桌子上并循环通过,但我可以想象我们采取的效率。有没有人有更好的方法来做这些替换?我看一下代码,我确信必须有更好的选择,但我不知道是什么。
感激地收到任何选项。
CREATE FUNCTION dbo.MakeFriendlyURL (@stringToConvert NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
SELECT @Result = CAST(@stringToConvert AS VARCHAR(MAX))
SELECT @Result = REPLACE(@Result, 'ä', 'ae')
SELECT @Result = REPLACE(@Result, 'ö', 'oe')
SELECT @Result = REPLACE(@Result, 'ü', 'ue')
SELECT @Result = REPLACE(@Result, 'Ä', 'Ae')
SELECT @Result = REPLACE(@Result, 'Ö', 'Oe')
SELECT @Result = REPLACE(@Result, 'Ü', 'Ue')
SELECT @Result = REPLACE(@Result, 'ß', 'ss')
SELECT @Result = REPLACE(@Result, 'é', 'e')
SELECT @Result = REPLACE(@Result, 'ê', 'e')
SELECT @Result = REPLACE(@Result, 'à', 'a')
SELECT @Result = REPLACE(@Result, 'è', 'e')
SELECT @Result = REPLACE(@Result, 'i', 'i')
SELECT @Result = REPLACE(@Result, 'l', 'l')
SELECT @Result = REPLACE(@Result, 'L', 'l')
SELECT @Result = REPLACE(@Result, 'd', 'd')
SELECT @Result = REPLACE(@Result, 'ø', 'o')
SELECT @Result = REPLACE(@Result, 'Þ', 'th')
SELECT @Result = REPLACE(@Result, ' ', '-')
SELECT @Result = REPLACE(@Result, '/', '-')
SELECT @Result = REPLACE(@Result, '&', '-')
SELECT @Result = REPLACE(@Result, '%', '-')
SELECT @Result = REPLACE(@Result, ',', '-')
SELECT @Result = REPLACE(@Result, ';', '-')
SELECT @Result = REPLACE(@Result, ':', '-')
SELECT @Result = REPLACE(@Result, '_', '-')
SELECT @Result = REPLACE(@Result, '+', '')
SELECT @Result = REPLACE(@Result, '.', '')
SELECT @Result = REPLACE(@Result, '""', '')
SELECT @Result = REPLACE(@Result, '*', '')
SELECT @Result = REPLACE(@Result, '<', '')
SELECT @Result = REPLACE(@Result, '>', '')
SELECT @Result = REPLACE(@Result, '?', '')
SELECT @Result = REPLACE(@Result, '‘', '')
SELECT @Result = REPLACE(@Result, '’', '')
SELECT @Result = REPLACE(@Result, CHAR(39), '')
WHILE CHARINDEX('--', @Result) > 0
BEGIN
SET @Result = REPLACE(@Result, '--', '-')
END
WHILE CHARINDEX('-', @Result) = 1
BEGIN
SET @Result = RIGHT(@Result, LEN(@Result) - 1)
END
WHILE LEN(@Result) > 0 AND SUBSTRING(@Result, LEN(@Result), 1) = '-'
BEGIN
SET @Result = LEFT(@Result, LEN(@Result) - 1)
END
RETURN @Result
END
GO
SELECT dbo.MakeFriendlyURL('A,B & C Tyres')
这主要用作我们向客户推出的导入流程的一部分,因此它的实施是RBAR,这不是理想的。但是这个函数对多个表使用了多次,所以我理解为什么它最初是这样开发的。随着数据集的增长,这变得越来越成问题。
答案 0 :(得分:3)
也许这样的事情会更高效,更容易维护。
通过使用表变量,替换序列似乎以保持正确。我还没有看到异常/失败。
如果使用表而不是表变量,请确保包含序列号和顺序。
示例强>
Declare @S nvarchar(max) = 'A,B & C Tyres'
Declare @MapValues table (MapFrom nvarchar(50),MapTo nvarchar(50))
Insert Into @MapValues values
( 'ä', 'ae'),
( 'ö', 'oe'),
( 'ü', 'ue'),
( 'Ä', 'Ae'),
( 'Ö', 'Oe'),
( 'Ü', 'Ue'),
( 'ß', 'ss'),
( 'é', 'e'),
( 'ê', 'e'),
( 'à', 'a'),
( 'è', 'e'),
( 'i', 'i'),
( 'l', 'l'),
( 'L', 'l'),
( 'd', 'd'),
( 'ø', 'o'),
( 'Þ', 'th'),
( ' ', '-'),
( '/', '-'),
( '&', '-'),
( '%', '-'),
( ',', '-'),
( ';', '-'),
( ':', '-'),
( '_', '-'),
( '+', ''),
( '.', ''),
( '""', ''),
( '*', ''),
( '<', ''),
( '>', ''),
( '?', ''),
( '‘', ''),
( '’', ''),
( CHAR(39), ''),
-- Cleanup
( '-----', '-'),
( '----', '-'),
( '---', '-'),
( '--', '-'),
( ' ', '-'),
( ' ', '-'),
( ' ', '-'),
( ' ', '-')
Select @S=Replace(@S,MapFrom,MapTo)
From @MapValues
Select @S
<强>返回强>
A-B-C-Tyres