Zastrzeżenie:funkcja odchudzona zgodnie z obietnicą, odpowiednio zaktualizuje opis odpowiedzi w odpowiednim czasie.
Zgodnie z moim obecnym rozumieniem twojego problemu, myślę, że mogę zastosować do niego funkcję, którą zaprojektowałem, aby rozwiązać bardziej złożony problem, który miałem ostatnio. Mogą istnieć inne rozwiązania, ale z pewnością inni mogą i zaproponują je, więc dlaczego nie zaoferuję Ci czegoś mniej do zaoferowania.
Pamiętaj jednak, że miało to dotyczyć czegoś bardziej złożonego niż Twoje (wyjaśnione później ) i teraz Niestety nie mam czasu na odchudzanie, ale do tego dojdę chyba jutro. Mam nadzieję, że komentarze pomogą. Niezależnie od tego podsumuję dla Ciebie cel mojej funkcji:
Jest tabela zawierająca wiadomości, które należy znaleźć i czym je zastąpić. Funkcja otrzyma wartość tekstową jako dane wejściowe, użyje kursora do zapętlenia wspomnianej tabeli, a dla każdego rekordu we wspomnianej tabeli sprawdzi, czy tekst wejściowy zawiera coś do zastąpienia i zamień, jeśli dotyczy.
Należy zwrócić uwagę na dwie rzeczy dotyczące pierwotnego celu. Po pierwsze, istnieje zagnieżdżona pętla, która odnosi się do scenariusza, w którym pewne słowo kluczowe istnieje wiele razy, a zatem wymaga wielu zamienników. Drugi, Miałem też do czynienia z symbolami wieloznacznymi, zmiennymi długościami i tym, czy w omawianej tabeli jest ustawiona flaga zastępcza. Te dwie rzeczy plus inne są prawdopodobnie powodem, dla którego znajdziesz wiele dziwnych materiałów latających wokół.
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