SQL-'08:多个Replace语句是不好的做法/是否有其他方法来编写此查询?

Tro*_*ure 7 sql ssis replace sql-server-2008

Select 
Distinct 
    REPLACE(REPLACE(REPLACE(REPLACE(Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') AS Department 
From 
     Inv WITH(NOLOCK) 
Run Code Online (Sandbox Code Playgroud)

我很想知道因为我是一名小型ETL工程师,并希望养成良好的习惯.

显然,在许多情况下,这可能会变得更长.

Nat*_*erl 5

嵌套替换很好,但随着嵌套级别的增加,代码的可读性下降.如果我要替换大量字符,我会选择像下表驱动方法那样更清洁的东西.

    declare @Category varchar(25)
    set @Category = 'ABC & DEF/GHI, LMN OP'
    -- nested replace
    select replace(replace(replace(replace(@Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') as Department 

    -- table driven
    declare @t table (ReplaceThis varchar(10), WithThis varchar(10))
    insert into @t
        values  (' & ', '-'), 
                ('/', '-'),
                (', ', '-'),
                (' ', '-')

    select  @Category = replace(@Category, ReplaceThis, isnull(WithThis, ''))                       
    from    @t
    where   charindex(ReplaceThis, @Category) > 0;

    select @Category [Department]
Run Code Online (Sandbox Code Playgroud)


Cad*_*oux 3

使用 SQLCLR 和正则表达式可能会更好。 http://blogs.msdn.com/b/sqlclr/archive/2005/06/29/regex.aspx

当然,这可以更加可维护和灵活。

就性能而言,您通常会发现很难击败内置函数,但对于许多 REPLACE 操作,CLR 可能会胜过它 - 您必须进行基准测试。

我注意到您说您正在 SSIS 中执行此操作 - 在这种情况下,您可以在数据流中使用各种其他可能的方法,包括脚本任务和正则表达式。作为一般规则,您需要评估正在执行的每个操作,并决定是否应该在将数据带入数据流的查询中或在数据流本身中完成该操作。某些操作可能更好地在源上执行(例如过滤),但其他操作(例如聚合)可能更好在数据流中执行,特别是如果它们对任何类型的运行数据都是有状态的。