Suchen und Ersetzen von Textteilen in MSSQL

      Kommentare deaktiviert für Suchen und Ersetzen von Textteilen in MSSQL

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