London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!


Nov 19, 2014
  4300
(0 votes)

Content search and replace

The development team I currently work in like to have content in line with production content but it very quickly becomes outdated.


To aid with this we have Go pipelines which restore production database backups over lower internal environment databases.


The CMS Site has many links to various other product journeys. These journeys have environment specific Urls. If we are are in our regression environment, we would like content links to hand off to the relevant regression product journeys.


Our go pipeline restores the production database and performs many content replacements by executing a search and replace stored procedure. Below you will find the stored procedure definition to search and replace content.


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_CustomSearchAndReplace]') AND type in (N'P', N'PC'))
      DROP PROCEDURE [dbo].[usp_CustomSearchAndReplace]
GO

CREATE PROCEDURE [dbo].[usp_CustomSearchAndReplace]
      @SearchFor nvarchar(1000),
      @ReplaceWith nvarchar(1000) = ''
AS
      SELECT * FROM [tblContentProperty] WHERE [String] LIKE '%' + @SearchFor + '%' OR [LongString] LIKE '%' + @SearchFor + '%'
      SELECT * FROM [tblWorkContentProperty] WHERE [String] LIKE '%' + @SearchFor + '%' OR [LongString] LIKE '%' + @SearchFor + '%'

      IF LEN(LTRIM(RTRIM(@ReplaceWith))) > 0
      BEGIN
            PRINT 'Updating published pages'
            UPDATE [tblContentProperty] SET [String] = REPLACE([String], @SearchFor, @ReplaceWith) WHERE [String] LIKE '%' + @SearchFor + '%'
            UPDATE [tblContentProperty] SET [LongString] = REPLACE(CAST([LongString] AS nvarchar(max)), @SearchFor, @ReplaceWith) WHERE [LongString] LIKE '%' + @SearchFor + '%'
            PRINT 'Updating unpublished pages'
            UPDATE [tblWorkContentProperty] SET [String] = REPLACE([String], @SearchFor, @ReplaceWith) WHERE [String] LIKE '%' + @SearchFor + '%'
            UPDATE [tblWorkContentProperty] SET [LongString] = REPLACE(CAST([LongString] AS nvarchar(max)), @SearchFor, @ReplaceWith) WHERE [LongString] LIKE '%' + @SearchFor + '%'
            PRINT 'Updating soft links'
            UPDATE [tblContentSoftlink] SET [LinkURL] = REPLACE([LinkURL], @SearchFor, @ReplaceWith) WHERE [LinkURL] LIKE '%' + @SearchFor + '%'
      END
Nov 19, 2014

Comments

Nov 19, 2014 02:27 PM

The TSQL above is for EPiServer v7.

For EPiSever v6 the following replacements will need to be made:
- Replace [tblContentProperty] with [tblProperty]
- Replace [tblWorkContentProperty] with [tblWorkProperty]
- Replace [tblContentSoftlink] with [tblPageSoftlink]

Henrik Fransas
Henrik Fransas Nov 19, 2014 03:58 PM

Do not forget that you have to make EPiServer to recycle the cache (IIS reset is the best way)

Nov 19, 2014 04:20 PM

Indeed, our Go pipelines recycle the application pools once content has been refreshed.

Nov 20, 2014 03:17 PM

Nice work Croweman. as ever I'd approach this in a slighlty different way using my favourite tool IIS UrlRewrite:)

Rather than modifying the datbase. I've approached this by adding some outbound rewrite rules. These scan any outbound html from the server and replace all instances of the live url with the test site url (or other environment). The advantage of this per environment configuration approach, is no changes to data. and you can be very sure that no urls matching that pattern willl ever appear, regardless of how they are entered in the website.

Obviously scanning outbound html incurs a small performance hit, but on a test environment this shouldn't be an issue.

I've put a gist together of the type of configuration needed.

https://gist.github.com/markeverard/8aa02cf0539d12cbefd7

Nov 20, 2014 05:37 PM

Very nice Doctor ;)

I didn't realise you could modify outgoing html using the rewrite module :)

Please login to comment.
Latest blogs
Render ContentArea without wrapping them in surrounding div

CustomContentAreaRenderer is a specialized class that overrides the default ContentAreaRenderer. It customizes the rendering behavior for content...

sunylcumar | May 18, 2025

Indexing a content item programatically

public bool IndexContent(int contentId, bool contentOnly, bool childrenOnly, string language) { // Retrieve the content var contentReference = new...

sunylcumar | May 18, 2025

Add a new menu item to the Admin Menu in Optimizely CMS

Create a new Controller called CustomMenuController and decorate with [Authorize(Roles ="CMSAdmins")] so that it will be accessed by admins only...

sunylcumar | May 18, 2025

Display page/block thumbnail based on selected site in multi-site solution

In previous blog we described how to control the visibility of the blocks or properties based on the current site in multisite solution. We can use...

Tomek Juranek | May 16, 2025