Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wykonać zagnieżdżoną zamianę wartości z innej tabeli?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Automatyzacja przetwarzania modelu tabelarycznego baz danych usług Analysis Services (SSAS) w programie SQL Server

  2. Nazwa kolumn zmiennych SQL Server?

  3. Modelowanie danych dla tych samych tabel z tymi samymi kolumnami

  4. SQL Server Konkatenacja GROUP BY

  5. Lepsze techniki przycinania wiodących zer w SQL Server?