表驱动的嵌套函数调用

时间:2014-06-24 14:05:02

标签: sql sql-server sql-server-2008 tsql

我正在寻找一种在列上应用任意数量的嵌套REPLACE调用的方法。理想情况下,模式和替换值将来自配置表,例如:

╔═════════╦═════════╗
║ Pattern ║ Replace ║
╠═════════╬═════════╣
║ -JAN-   ║ /01/    ║
║ -FEB-   ║ /02/    ║
║ -MAR-   ║ /03/    ║
║ -APR-   ║ /04/    ║
║ -MAY-   ║ /05/    ║
║ etc.    ║         ║
╚═════════╩═════════╝

问题基本上与this one相同,但给出的答案仅在一次分配一个输入值的结果时起作用 - 我想返回整个结果集。

我在想像递归CTE可能有用......

示例数据

╔═══════════════╦══════════════╗
║     Input     ║    Output    ║
╠═══════════════╬══════════════╣
║ DataData-JAN- ║ DataData/01/ ║
║ -APR--MAY-    ║ /04//05/     ║
║ -MAR-TESTING  ║ /03/TESTING  ║
╚═══════════════╩══════════════╝

1 个答案:

答案 0 :(得分:1)

在你提到的链接中找到解决方案,并将其放在一个函数中:

create table Replacement(ReplaceThis varchar(10), WithThis varchar(10))
insert into Replacement
    values  ('-JAN-', '/01/'), 
            ('-FEB-', '/02/'),
            ('-MAR-', '/03/'),
            ('-APR-', '/04/'),
            ('-MAY-', '/05/')

create table input(val varchar(100))
insert input
values ('DataData-JAN-'),
       ('-APR--MAY-'),
       ('-MAR-TESTING')

go

create function dbo.ReplaceValues(@input varchar(100))
returns varchar(100)
as
begin       
    select  @input = replace(@input, ReplaceThis, isnull(WithThis, ''))                       
    from    Replacement
    where   charindex(ReplaceThis, @input) > 0

    return @input
end

go

select val, dbo.ReplaceValues(val)
from input

SQL Fiddle