Recursiva substituir de uma tabela de caracteres

Em resumo, estou procurando uma única consulta recursiva que possa executar várias substituições em uma cadeia. Eu tenho uma noção de que isso pode ser feito, mas não estou conseguindo envolver minha cabeça em torno dele.

Concedido, eu preferiria que a camada de negócios do aplicativo, ou até mesmo o CLR, fizesse a substituição, mas estas não são opções neste caso.

Mais especificamente, eu quero substituir a bagunça abaixo - que é C & P em 8 procedimentos armazenados diferentes - por um TVF.

<code>SET @temp = REPLACE(RTRIM(@target), '~', '-')
SET @temp = REPLACE(@temp, '''', '-')
SET @temp = REPLACE(@temp, '!', '-')
SET @temp = REPLACE(@temp, '@', '-')
SET @temp = REPLACE(@temp, '#', '-')
-- 23 additional lines reducted
SET @target = @temp
</code>

Aqui é onde eu comecei:

<code>-- I have a split string TVF called tvf_SplitString that takes a string 
-- and a splitter, and returns a table with one row for each element.
-- EDIT: tvf_SplitString returns a two-column table: pos, element, of which
--       pos is simply the row_number of the element.
SELECT REPLACE('A~B!C@D@C!B~A', MM.ELEMENT, '-') TGT
FROM   dbo.tvf_SplitString('~-''-!-@-#', '-') MM
</code>

Observe que juntei todos os caracteres ofensivos em uma única string separada por '-' (sabendo que '-' nunca será um dos caracteres ofensivos), que é então dividido. O resultado dessa consulta é semelhante a:

<code>TGT
------------
A-B!C@D@C!B-A
A~B!C@D@C!B~A
A~B-C@D@C-B~A
A~B!C-D-C!B~A
A~B!C@D@C!B~A
</code>

Então, a substituição funciona claramente, mas agora eu quero que ela seja recursiva para que eu possa puxar o top 1 e, eventualmente, sair com:

<code>TGT
------------
A-B-C-D-C-B-A
</code>

Alguma idéia de como fazer isso com uma consulta?

EDIT: Bem, a recursão real não é necessária se houver outra maneira. Estou ponderando o uso de uma tabela de números aqui também.

questionAnswers(2)

yourAnswerToTheQuestion