免責事項:機能は約束どおりスリム化されており、適切な時期に回答の説明が更新されます。
あなたの問題についての私の現在の理解によれば、最近発生したより複雑な問題を解決するために設計した機能をそれに適用できると思います。他の解決策があるかもしれませんが、他の人がそれらを提案できることは間違いありません。
ただし、これはあなたのものよりも複雑な問題に対処するためのものであることに注意してください (後で説明 )、そして今 残念ながら、それをスリム化する時間がありませんが、おそらく明日に到達します.コメントがお役に立てば幸いです。とにかく、私はあなたのために私の機能の目的を要約します:
検索するメッセージと、それらを置き換えるメッセージを含むテーブルがあります。この関数はテキスト値を入力として受け取り、カーソルを使用してテーブルをループし、テーブル内の各レコードについて、入力テキストに置換するものが含まれているかどうかを確認し、該当する場合は置換します。
本来の目的について注意すべき点が 2 つあります。 まず 特定のキーワードが複数回存在するシナリオに対処するためのネストされたループがあり、複数の置換が必要になります。 第二に、 ワイルドカード、可変長、および議論されたテーブルで置換フラグが設定されているかどうかについても対処する必要がありました。これらの 2 つのこととその他のことが原因で、多くの奇妙な素材が飛び交っています。
CREATE FUNCTION [JACKINABOX](@TextToUpdate varchar(30), @FilterId int)
RETURNS varchar(30) AS
BEGIN
DECLARE @Keyword varchar(30)
DECLARE LonelyCursor CURSOR FOR
SELECT Keyword FROM ReplacementInformation WHERE Id = @FilterId
OPEN LonelyCursor ; FETCH NEXT FROM LonelyCursor INTO @Keyword
WHILE @@FETCH_STATUS = 0 -- While there still remains keywords to process.
BEGIN
WHILE 1 = 1 -- Not sure, but I think this nested loop can be unlooped if [FETCH NEXT] was cut & pasted to replace [BREAK].
BEGIN
IF(CHARINDEX(@Keyword, @TextToUpdate) = 0)
BREAK -- If cannot find current keyword anymore, move on to next keyword.
ELSE -- Otherwise, update text then check again for same keyword.
SET @TextToUpdate = REPLACE(@TextToUpdate, @Keyword, CONCAT('Replaced_', @Keyword))
END
FETCH NEXT FROM LonelyCursor INTO @Keyword
END
CLOSE LonelyCursor ; DEALLOCATE LonelyCursor
RETURN @TextToUpdate
END