Odmítnutí odpovědnosti:Funkce se zeštíhlila, jak bylo slíbeno, včas odpovídajícím způsobem aktualizuje popis odpovědi.
Podle mého současného chápání vašeho problému si myslím, že na něj mohu použít funkci, kterou jsem navrhl k vyřešení složitějšího problému, který jsem měl nedávno. Mohou existovat i jiná řešení, ale s největší pravděpodobností je mohou a navrhnou jiní, tak proč vám nenabídnu o něco méně.
Upozorňujeme, že to bylo určeno k řešení něčeho složitějšího, než je ten váš (vysvětleno později ) a právě teď Bohužel nemám čas to zeštíhlit, ale zítra se k tomu dostanu. Doufám, že komentáře pomohou. Bez ohledu na to vám shrnu cíl své funkce:
Existuje tabulka, která obsahuje, jaké zprávy najít a čím je nahradit. Funkce obdrží jako vstup textovou hodnotu, použije kurzor k zacyklení uvedené tabulky a pro každý záznam v této tabulce zkontroluje, zda vstupní text obsahuje něco, co je třeba nahradit, a případně nahradit.
K původnímu cíli je třeba poznamenat dvě věci. Za prvé existuje vnořená smyčka, která řeší scénář, kdy určité klíčové slovo existuje vícekrát, a proto vyžaduje vícenásobné nahrazení. Zadruhé Musel jsem se také vypořádat se zástupnými znaky, proměnnými délkami a tím, zda je v diskutované tabulce nastaven příznak nahrazení. Tyto dvě věci plus další jsou pravděpodobně důvodem, proč najdete spoustu podivného materiálu poletujícího kolem.
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