つまり、1 つの文字列に対して複数の置換を実行できる単一の再帰クエリを探しています。私はそれができるという考えを持っていますが、頭を包むことができていません。
確かに、私はアプリケーションのビズ層、または CLR でさえ置き換えを行うことを好みますが、これらはこの場合のオプションではありません。
より具体的には、以下の混乱 (8 つの異なるストアド プロシージャの C&P) を TVF に置き換えたいと考えています。
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
これが私が始めたところです:
-- 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
問題のあるすべての文字を「-」で区切られた単一の文字列に結合したことに注意してください (「-」が問題の文字の 1 つになることは決してないことがわかっています)。このクエリの結果は次のようになります。
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
したがって、置換は明らかに機能しますが、再帰的にしたいので、トップ 1 をプルして、最終的には次のようになります。
TGT
------------
A-B-C-D-C-B-A
1 つのクエリでこれを達成する方法についてのアイデアはありますか?
編集:別の方法があれば、実際の再帰は必要ありません。ここでも数表の使用を考えています。