Wenn man Textteile suchen und ersetzen möchte, dann geht das in SQL einfach mit der REPLACE-Funktion. Leider stößt die Funktion bei TEXT-Feldern an Ihre Grenzen und verweigert den Dienst.
Um aber dennoch Textteile ersetzen zu können habe ich unter http://blogs.x2line.com/al/archive/2008/05/03/3417.aspx die Lösung gefunden (und noch verfeinert 🙂 ).
Ich habe es noch ein wenig auf gebohrt, so dass man auch die Tabelle und die Spalte, in der die Ersetzung statt finden soll, selbst bestimmen kann.
CREATE PROCEDURE [dbo].[SearchAndReplace] @FindString NVARCHAR(100), @ReplaceString NVARCHAR(100), @ReplaceTable NVARCHAR(100), @column NVARCHAR(100), @id_column NVARCHAR(100) AS BEGIN DECLARE @TextPointer VARBINARY(16), @DeleteLength INT, @OffSet INT, @id INT, @sql VARCHAR(8000) SET @DeleteLength = LEN(@FindString) SET @FindString = '%' + @FindString + '%' SET @sql = ' DECLARE @TextPointer VARBINARY(16), @OffSet INT, @id VARCHAR(50) DECLARE searchReplace CURSOR FOR SELECT TEXTPTR('+@column+'), '+@id_column+' FROM '+@ReplaceTable+' OPEN searchReplace FETCH NEXT FROM searchReplace INTO @TextPointer, @id WHILE @@FETCH_STATUS = 0 BEGIN PRINT @id SET @OffSet = 0 WHILE ((SELECT COUNT(*) FROM '+@ReplaceTable+' WHERE (PATINDEX('''+@FindString+''', '+@column+' COLLATE Latin1_General_BIN) 0 AND '+@id_column+' = @id)) > 0) BEGIN SELECT @OffSet = PATINDEX('''+@FindString+''', '+@column+' COLLATE Latin1_General_BIN) FROM '+@ReplaceTable+' WHERE PATINDEX('''+@FindString+''', '+@column+') <> 0 AND '+@id_column+' = @id SET @OffSet = @OffSet -1 UPDATETEXT '+@ReplaceTable+'.'+@column+' @TextPointer @OffSet '+CAST(LEN(@DeleteLength) AS VARCHAR)+' '''+@ReplaceString+''' END FETCH NEXT FROM searchReplace INTO @TextPointer, @id END CLOSE searchReplace DEALLOCATE searchReplace' PRINT @sql EXEC(@sql) SELECT @FindString+' has been replaced by '+@ReplaceString+' in ReplaceTable "'+@ReplaceTable+'" within column "'+@spalte+'"' END