Alternativen zu REPLACE für einen Text- oder ntext-Datentyp

101

Ich muss die Daten in datatable.column aktualisieren / ersetzen. Die Tabelle hat ein Feld mit dem Namen Content. Ich benutze die REPLACEFunktion. Da der Spaltendatentyp lautet NTEXT, kann ich die REPLACEFunktion in SQL Server nicht verwenden .

Ich kann den Datentyp nicht ändern, da es sich bei dieser Datenbank um eine Softwaretabelle eines Drittanbieters handelt. Das Ändern des Datentyps führt zum Fehlschlagen der Anwendung.

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = REPLACE(Content,'ABC','DEF') 
WHERE Content LIKE '%ABC%' 

Ich erhalte diesen Fehler:

Meldung 8116, Ebene 16, Status 1, Zeile 1 Der Argumentdatentyp ntext ist für Argument 1 der Ersetzungsfunktion ungültig.

  • Kann ich das mit T-SQL beheben? Hat jemand ein Beispiel zum Lesen und Schleifen?
  • Da es sich um eine einmalige Konvertierung handelt, kann ich möglicherweise zu einem anderen Typ wechseln, aber ich befürchte, dass ich die Daten durcheinander bringe.

Es gibt ein Primärschlüsselfeld: Name: ID - Ganzzahl - es ist eine Identität ... Also muss ich auch darüber nachdenken. Setzen Sie die Identität möglicherweise vorübergehend auf N.

Bitte geben Sie an, wie Sie die REPLACE-Funktion erreichen können.

Ca. 3000 Anweisungen müssen mit einer neuen Lösung aktualisiert werden.

ethem
quelle
Ist das SQL Server 2000?
p.campbell
ANTWORT: Ich verwende SQL2008 ... und die DATABASE hat die Kompatibilitätsstufe 2000 (80). Wenn ich das auch 2008 ändere, funktioniert es dann? Da ich die Konsequenzen noch nicht kenne, habe ich die Kompatibilitätsstufe 2000 verlassen, aber es ist die SQL 2008-Datenbank. Dies ist eine einmalige Umwandlung ...
ethem

Antworten:

197

WENN Ihre Daten nicht über 4000 Zeichen hinausgehen UND Sie sich in SQL Server 2000 oder einer Kompatibilitätsstufe von 8 oder SQL Server 2000 befinden:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(4000)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 

Für SQL Server 2005+:

UPDATE [CMS_DB_test].[dbo].[cms_HtmlText] 
SET Content = CAST(REPLACE(CAST(Content as NVarchar(MAX)),'ABC','DEF') AS NText)
WHERE Content LIKE '%ABC%' 
p.campbell
quelle
3
Nur eine kurze Frage, ist die zweite Besetzung NTextwirklich notwendig? Ich würde denken, dass das Zuweisen NVarchar(MAX)zu NTextes automatisch besetzen würde.
Tahir Hassan
3
Tolle einfache Lösung. Nur eine Anmerkung, dass der 2005+ nvarchar (max) kein 4000-Zeichen-Limit hat. Ich weiß, dass es offensichtlich ist (jetzt für mich), aber ich habe es zuerst gelesen, als ob beide Antworten diese Grenze hätten.
Goodeye
16

Unter der Annahme von SQL Server 2000 sollte die folgende StackOverflow-Frage Ihr Problem lösen.

Wenn Sie SQL Server 2005/2008 verwenden, können Sie den folgenden Code verwenden (von hier übernommen ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
LittleBobbyTables - Au Revoir
quelle