Reemplazo recursivo de una tabla de caracteres.

En resumen, estoy buscando una única consulta recursiva que pueda realizar múltiples reemplazos en una cadena. Tengo una idea de que se puede hacer, pero no estoy logrando rodear mi cabeza con eso.

Por supuesto, prefiero la capa de negocios de la aplicación, o incluso el CLR, para hacer el reemplazo, pero estas no son opciones en este caso.

Más específicamente, quiero reemplazar el lío a continuación, que es C&P en 8 procedimientos almacenados diferentes, con un 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>

Aquí es donde he empezado:

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

Note que me he unido a todos los caracteres ofensivos en una sola cadena separada por '-' (sabiendo que '-' nunca será uno de los caracteres ofensivos), que luego se divide. El resultado de esta consulta se ve como:

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

Por lo tanto, el reemplazo funciona claramente, pero ahora quiero que sea recursivo para poder sacar el primer lugar y finalmente salir con:

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

¿Alguna idea sobre cómo lograr esto con una consulta?

EDIT: Bueno, la recursión real no es necesaria si hay otra manera. También estoy considerando el uso de una tabla de números.

Respuestas a la pregunta(2)

Su respuesta a la pregunta