SQL Server多次替换

时间:2018-01-04 12:09:21

标签: sql sql-server string performance replace

使用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,这不是理想的。但是这个函数对多个表使用了多次,所以我理解为什么它最初是这样开发的。随着数据集的增长,这变得越来越成问题。

1 个答案:

答案 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