2011-10-21 35 views
2

我試圖實現的是動態的一系列替代,必須在某個領域進行。 (爲了讓事情變得更簡單,我想其實刪除數據,所以我會用SQL Server中的集合替換?

總是比較說,有時我會做只有一個置換:

... REPLACE(myField, stringToRemove, '') 

有時候,我會需要兩個替代:

... REPLACE(REPLACE(myField, stringToRemove, ''), anotherStringToRemove, '') 

不過,我需要這個充滿活力的,我事先不知道我有多少價值就會有,所以,有多少替代品(清除)我得

我嘗試搜索聚合字符串操作函數,當然,沒有。我也知道這可以通過CLR聚合函數來實現,但我沒有使用它的可能性。

任何想法?

+0

對於REPLACE()調用的數量,你有什麼條件? – 2011-10-21 03:29:45

+0

動態變量。現在它是滿足特定條件的行數。你可以把它想象成一個配置表:'Replacements(stringToRemove nvarchar)' – Alpha

回答

3

您可以使用FromValue和ToValue設置表變量並使用while循環執行替換。

-- Table to replace in 
declare @T table 
(
    Value varchar(50) 
) 

insert into @T values 
('first second third'), 
('first second third') 

-- Table with strings to replace 
declare @Rep table 
(
    ID int identity primary key, 
    FromValue varchar(50), 
    ToValue varchar(50) 
) 

insert into @Rep values 
('second', 'fourth'), 
('third', 'fifth') 

declare @ID int 
select @ID = max(ID) 
from @Rep 

while @ID > 0 
begin 
    update @T 
    set Value = replace(Value, FromValue, ToValue) 
    from @Rep 
    where ID = @ID 

    set @ID -= 1 
end 

select * 
from @T 

結果:

Value 
------------------- 
first fourth fifth 
first fourth fifth 

如果你只是想查詢你可以做這樣的事情的價值。

;with C as 
(
    select 0 as ID, 
     Value, 
     0 as Lvl 
    from @T 
    union all 
    select R.ID, 
     cast(replace(C.Value, R.FromValue, R.ToValue) as varchar(50)), 
     Lvl + 1 
    from @Rep as R 
    inner join C 
     on C.ID + 1 = R.ID 
) 
select top 1 with ties Value 
from C 
order by Lvl desc 
+0

我在你面前鞠躬!不僅你擊中了指甲,而且讓你看起來很簡單(這通常是一位好老師的標誌)。非常感謝。 :) – Alpha

+0

@Alpha - 謝謝,我很高興我能幫上忙。 –

0

您可能必須編寫一個標量函數,將原始字符串傳遞給該標量函數,並提供足夠的信息來知道要刪除哪些字符串,並使其循環並返回替換集的結果。