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.


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%' 

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.