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
