Penafian:Fungsi diperkecil seperti yang dijanjikan, akan memperbarui deskripsi jawaban yang sesuai pada waktunya.
Per pemahaman saya saat ini tentang masalah Anda, saya pikir saya dapat menerapkannya pada fungsi yang saya rancang untuk memecahkan masalah yang lebih kompleks yang saya miliki baru-baru ini. Mungkin ada solusi lain, tapi pasti orang lain bisa &akan mengusulkannya, jadi mengapa saya tidak menawarkan sesuatu yang lebih sedikit untuk ditawarkan.
Harap diperhatikan, ini dimaksudkan untuk mengatasi sesuatu yang lebih kompleks daripada milik Anda (dijelaskan nanti ), dan sekarang Sayangnya saya tidak punya waktu untuk melangsingkannya, tetapi saya akan melakukannya mungkin besok. Saya harap komentarnya membantu. Terlepas dari itu, Saya akan meringkas tujuan fungsi saya untuk Anda:
Ada tabel yang berisi pesan apa yang harus ditemukan, dan apa yang harus diganti. Fungsi akan menerima nilai teks sebagai input, akan menggunakan kursor untuk mengulang tabel tersebut, dan untuk setiap record dalam tabel tersebut akan memeriksa apakah teks input berisi sesuatu untuk diganti, dan diganti jika berlaku.
Dua hal yang perlu diperhatikan tentang tujuan awal. Pertama, ada loop bersarang untuk mengatasi skenario di mana kata kunci tertentu ada beberapa kali, sehingga membutuhkan banyak penggantian. Kedua, Saya juga harus berurusan dengan wildcard, panjang variabel, dan apakah flag pengganti diatur dalam tabel yang dibahas atau tidak. Dua hal ini ditambah yang lain mungkin adalah alasan mengapa Anda akan menemukan banyak materi aneh berterbangan.
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