Rekurencyjne zastąpienie z tabeli znaków

W skrócie, szukam pojedynczego zapytania rekurencyjnego, które może wykonać wiele zastąpień w jednym ciągu. Mam pojęcie, że można to zrobić, ale nie potrafię tego owinąć głową.

Oczywiście wolę, aby biz-layer aplikacji, a nawet CLR, dokonywał wymiany, ale w tym przypadku nie są to opcje.

Dokładniej, chcę zastąpić poniższy bałagan - który jest C&P w 8 różnych procedurach przechowywanych - za pomocą 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>

Tutaj zacząłem:

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

Zauważ, że dołączyłem wszystkie obraźliwe znaki do pojedynczego ciągu oddzielonego znakiem „-” (wiedząc, że „-” nigdy nie będzie jednym z obraźliwych znaków), który jest następnie dzielony. Wynik tego zapytania wygląda następująco:

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

Tak więc zastępstwo wyraźnie działa, ale teraz chcę, aby było rekurencyjne, abym mógł wyciągnąć pierwszą i ostatecznie wyjść z:

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

Jakieś pomysły, jak to zrobić za pomocą jednego zapytania?

EDYCJA: Cóż, rzeczywista rekursja nie jest konieczna, jeśli istnieje inny sposób. Zastanawiam się również nad użyciem tabeli liczb.

questionAnswers(2)

yourAnswerToTheQuestion