Rekursives Ersetzen aus einer Zeichentabelle

Kurz gesagt, ich suche nach einer einzelnen rekursiven Abfrage, die mehrere Ersetzungen über eine Zeichenfolge durchführen kann. Ich habe eine Ahnung, dass es getan werden kann, aber es gelingt mir nicht, meinen Kopf darum zu wickeln.

Zugegeben, ich würde es vorziehen, wenn die Business-Ebene der Anwendung oder sogar die CLR das Ersetzen übernimmt, aber dies sind in diesem Fall keine Optionen.

Genauer gesagt möchte ich das folgende Durcheinander - das C & P in 8 verschiedenen gespeicherten Prozeduren ist - durch ein TVF ersetzen.

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

Hier habe ich angefangen:

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

Beachten Sie, dass ich alle beleidigenden Zeichen zu einer durch '-' getrennten Zeichenfolge zusammengefasst habe (in dem Wissen, dass '-' niemals eines der beleidigenden Zeichen sein wird), die dann geteilt wird. Das Ergebnis dieser Abfrage sieht folgendermaßen aus:

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

Das Ersetzen funktioniert also, aber jetzt möchte ich, dass es rekursiv ist, damit ich die erste 1 ziehen und schließlich Folgendes herausfinden kann:

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

Irgendwelche Ideen, wie dies mit einer Abfrage erreicht werden kann?

EDIT: Nun, eine tatsächliche Rekursion ist nicht notwendig, wenn es einen anderen Weg gibt. Ich denke auch hier über die Verwendung einer Zahlentabelle nach.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage