Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để thực hiện thay thế lồng nhau của các giá trị từ một bảng khác?

Tuyên bố từ chối trách nhiệm:Chức năng được thu gọn lại như đã hứa, sẽ cập nhật mô tả câu trả lời tương ứng trong thời gian thích hợp.

Theo hiểu biết hiện tại của tôi về vấn đề của bạn, tôi nghĩ tôi có thể áp dụng cho nó một chức năng mà tôi đã thiết kế để giải quyết một vấn đề phức tạp hơn mà tôi gặp phải gần đây. Có thể có các giải pháp khác, nhưng chắc chắn những người khác có thể &sẽ đề xuất chúng, vậy tại sao tôi không cung cấp cho bạn một thứ gì đó ít hơn một chút để được cung cấp.

Tuy nhiên, hãy lưu ý rằng nó có nghĩa là để giải quyết một cái gì đó phức tạp hơn của bạn ( giải thích sau ), và ngay bây giờ Tôi buồn là không có thời gian để giảm bớt nó, nhưng có lẽ tôi sẽ đạt được điều đó vào ngày mai. Tôi hy vọng các ý kiến ​​giúp đỡ. Bất chấp điều đó, Tôi sẽ tóm tắt mục tiêu của chức năng của tôi cho bạn:

Có một bảng chứa những thông báo cần tìm và những gì cần thay thế chúng. Hàm sẽ nhận một giá trị văn bản làm đầu vào, sẽ sử dụng con trỏ để lặp lại bảng đã nói và đối với mỗi bản ghi trong bảng đó, nó sẽ kiểm tra xem văn bản đầu vào có chứa thứ gì đó để thay thế hay không và thay thế nếu có.

Hai điều cần lưu ý về vật kính ban đầu. Đầu tiên, có một vòng lặp lồng nhau để giải quyết tình huống trong đó một từ khóa nhất định tồn tại nhiều lần, do đó yêu cầu nhiều lần thay thế. Thứ hai, Tôi cũng phải đối phó với các ký tự đại diện, độ dài thay đổi và liệu cờ thay thế có được đặt trong bảng đã thảo luận hay không. Hai thứ này cộng với những thứ khác có thể là lý do bạn sẽ thấy rất nhiều vật chất kỳ lạ bay xung quanh.

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. SQL-Server:Cú pháp không chính xác gần từ khóa 'with'. Nếu câu lệnh này là một biểu thức bảng thông thường

  2. Truy vấn SQL 'LIKE' sử dụng '%' trong đó tiêu chí tìm kiếm chứa '%'

  3. Lỗi kết nối SQL Server 2008 Không có quy trình nào ở đầu kia của đường ống

  4. Cơ sở dữ liệu SQL Server Số liệu thống kê sử dụng CPU

  5. Đổi tên cột SQL Server 2008