Suchen und Ersetzen von Textteilen in MSSQL

by Maik
Categories: Allgemein
Tags: No Tags
Comments: No Comments
Published on: 28.03.2011

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

Welcome , today is Donnerstag, 23.02.2012