SQL: Replace Part Of A Column On Multiple Rows Based On Second Table
I have a table (pages) that holds properties for web pages, including a column for the page content itself, an NVARCHAR(MAX) column. Within that column, I need to find and replace
Solution 1:
Here's a single-statement, non-cursor method which makes use of a CTE:
WITH CTE(iteration, page_id, content) AS (
SELECT
0,
P.page_id,
REPLACE(P.content, M1.old_value, M1.new_value)
FROM
Pages P
INNER JOIN Moving M1 ON
P.content LIKE '%' + M1.old_value + '%'
WHERE
NOT EXISTS (SELECT * FROM Moving M2 WHERE P.content LIKE '%' + M2.old_value + '%' AND M2.moving_id < M1.moving_id)
UNION ALL
SELECT
CTE.iteration + 1,
CTE.page_id,
REPLACE(CTE.content, M3.old_value, M3.new_value)
FROM
CTE
INNER JOIN Moving M3 ON
CTE.content LIKE '%' + M3.old_value + '%'
WHERE
NOT EXISTS (SELECT * FROM Moving M4 WHERE CTE.content LIKE '%' + M4.old_value + '%' AND M4.moving_id < M3.moving_id)
)
UPDATE P2
SET
content = CTE1.content
FROM
Pages P2
INNER JOIN CTE CTE1 ON
CTE1.page_id = P2.page_id AND
NOT EXISTS (SELECT * FROM CTE CTE2 WHERE page_id = P2.page_id AND CTE2.iteration > CTE1.iteration)
Solution 2:
Try this
DECLARE @OldV NVARCHAR(32) -- Adjust for your field sizes in MOVING
DECLARE @NEWV NVARCHAR(32)
DECLARE db_cursor CURSOR FOR
SELECT *
FROM Moving
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @OldV,@newV
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Pages SET content=REPLACE(content,@oldV,@NewV)
WHERE content LIKE '%'+@OldV+'%'
FETCH NEXT FROM db_cursor INTO @oldV,@NewV
END
CLOSE db_cursor
DEALLOCATE db_cursor
Although I generally don't like cursors, this should do the trick for you
Post a Comment for "SQL: Replace Part Of A Column On Multiple Rows Based On Second Table"