2008-11-14 7 views
27

Ich habe ein klassisches Problem getroffen, eine Zeichenfolge ersetzen in einem Textfeld in einer SQL 2000-Datenbank zu tun. Dies könnte entweder ein Update über eine ganze Spalte oder ein einzelnes Feld sein. Ich bin nicht pingelig.t-sql ersetzen auf Textfeld

Ich habe ein paar Beispiele gefunden, wie man updatetext verwendet, um sie zu erreichen, aber sie neigen dazu, in gespeicherten Prozeduren zu sein, weiß irgendjemand von einer ähnlichen Sache, die in eine Funktion eingewickelt ist, so kann ich sie verwenden, wie ich normalerweise verwenden würde Ersetzen(). Das Problem mit der Replace() -Funktion für alle, die nicht wissen, ist, dass es Textfelder nicht unterstützt.

Edit: Ich erkannte, dass ich varchar (8000) wahrscheinlich durchkommen könnte, also haben die Felder auf diesen Typ getauscht, der das Problem behebt. Ich habe nie eine echte Lösung gefunden.

+0

Ich denke, Sie müssen mehr Details zur Verfügung stellen. Möchten Sie ein einzelnes Feld einer einzelnen Zeile aktualisieren? Was ist das Problem mit replace() selbst? – Jaywalker

+0

BTW, UPDATETEXT soll aus einer zukünftigen Version von SQL Server (> 2008) entfernt werden –

+0

Werfen Sie einen Blick auf meine Antwort Mann – JohnIdol

Antwort

3

Ich fürchte, Sie es nicht innerhalb einer Funktion tun

Wenn Sie versuchen, eine Funktion zu erklären, wie:

create function dbo.textReplace(
@inText as text) 
returns text 
as 
begin 
    return 'a' -- just dummy code 
end 

Sie erhalten die folgende Fehlermeldung erhalten:

The text data type is invalid for return values. 

In anderen Wörter, die Sie nicht ein einfaches Äquivalent der REPLACE-Funktion für den Text-Datentyp schreiben konnten

+0

Es ist wahr :(.... das ist, warum ich VARCHAR (MAX) in SQL Server 2005 liebe, das Ihnen erlaubt, alle VARCHAR-Funktionen auf einer 2gig Länge zu tun:) –

+1

Für SQL 2005 und wo Ihre Daten weniger als 2GB Länge ist, hier ist eine Lösung, die für mich funktioniert => http://StackOverflow.com/a/2641280/743 –

4

Dies ist mein Code-Schnipsel für dieses Szenario:

DECLARE @oldtext varchar(1000) 
DECLARE @newtext varchar(1000) 
DECLARE @textlen int 
DECLARE @ptr  binary(16) 
DECLARE @pos  int 
DECLARE @id   uniqueidentifier 

SET @oldtext = 'oldtext' 
SET @newtext = 'newtext' 
SET @textlen = LEN(@oldtext) 

DECLARE mycursor CURSOR LOCAL FAST_FORWARD 
FOR 
    SELECT [UniqueID] 
      ,TEXTPTR([Text]) 
      ,CHARINDEX(@oldtext, [Text]) - 1 
    FROM [dbo].[myTable] 
    WHERE [Text] LIKE '%' + @oldtext +'%' 

OPEN mycursor 

FETCH NEXT FROM mycursor into @id, @ptr, @pos 

WHILE @@fetch_status = 0 
BEGIN 
    UPDATETEXT [dbo].[myTable].Text @ptr @pos @textlen @newtext 

    FETCH NEXT FROM mycursor into @id, @ptr, @pos 
END 

CLOSE mycursor 
DEALLOCATE mycursor 
1

Sie haben würden das Textfeld zu einem varchar (8000) oder nvarchar (4000), wenn Sie ersetzen über ein ntext Feld zu werfen.

MyField = REPLACE (CAST (MyField als VARCHAR (4000)), "string1", "string2")

Dies wird natürlich nur funktionieren, wenn Sie den Inhalt auf dem Gebiet garantieren < ist = 4000/8000 Zeichen in der Länge.

1

Sie können auch die Funktion SUBSTRING() verwenden, die ein varchar zurückgibt, wenn ein Textwert übergeben wird.

Zum Beispiel:

MyVarchar = SUBSTRING(myTextField, 1, DATALENGTH(myTextField)) 

Wenn Sie eine varchar mit einer bestimmten Länge bevölkern, können Sie gestutzt passen:

MyVarchar100 = SUBSTRING(myTextField, 1, 100) 
45

Hier ist die Beispielabfrage Tabelle mit Textspalte zu aktualisieren Verwenden der REPLACE-Funktion. Hoffe, das ist nützlich für dich.

UPDATE <Table> set textcolumn= 
REPLACE(SUBSTRING(textcolumn,1,DATALENGTH(textcolumn)),'findtext','replacetext') 
WHERE <Condition> 
+11

Warnung: Teilzeichenfolge gibt varchar zurück und wird auf 8000 Zeichen abgeschnitten (4000 für ntext) genau wie andere String-Funktionen.Überprüfen Sie mit SELECT DATALENGTH (Textspalte), DATALENGTH (Teilzeichenfolge (Textspalte, 1, DATALENGTH (Textspalte))) – Jerph

+3

@suryakiran Dies hat mir wirklich geholfen, schnell einige Namen durch Entfernen unerwünschter Zeichen zu ändern. Danke –

+0

Vielen Dank für diese Lösung. Ich hatte seit Stunden gesucht. :) –