Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara membuat penggantian nilai bersarang dari tabel lain?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mitos Kinerja SQL Server yang Berbahaya dan Menyebar

  2. jTDS salah melaporkan info tipe data dalam metadata kumpulan hasil (untuk kolom DATE, laporkan NVARCHAR)

  3. Fitur Baru SQL Server 2019

  4. Sintaks GRANT untuk domain\pengguna

  5. Membungkus pernyataan SQL Server 2008 apa pun dengan operator lewati/ambil