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