alternative a REPLACE su un tipo di dati text o ntext


101

Ho bisogno di aggiornare / sostituire i dati in datatable.column. La tabella ha un campo denominato Content. Sto usando la REPLACEfunzione. Poiché il tipo di dati della colonna è NTEXT, SQL Server non mi consente di utilizzare la REPLACEfunzione.

Non riesco a modificare il tipo di dati perché questo database è una tabella software di terze parti. La modifica del tipo di dati causerà il fallimento dell'applicazione.

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

Ricevo questo errore:

Msg 8116, livello 16, stato 1, riga 1 Il tipo di dati dell'argomento ntext non è valido per l'argomento 1 della funzione di sostituzione.

  • Posso risolvere questo problema con T-SQL? Qualcuno ha un esempio su come leggere e riprodurre in loop?
  • Poiché questa è una conversione una tantum, forse posso passare a un altro tipo ma temo di incasinare i dati.

C'è un campo chiave primaria: nome: ID - intero - è un'identità .... Quindi devo pensare anche a questo. Forse impostare l'identità su N temporaneo.

Si prega di consigliare su come ottenere la funzione REPLACE?

Circa. 3000 rendiconti devono essere aggiornati con una nuova soluzione.


È questo SQL Server 2000?
p

RISPOSTA: Sto usando SQL2008 ... e il DATABASE ha il livello di compatibilità 2000 (80). Se cambio anche questo 2008 funzionerà? siccome non conosco ancora le conseguenze sono partito al livello di compatibilità 2000, ma è SQL 2008 Database. questa è una conversione una tantum ...
ethem

Risposte:


197

SE i tuoi dati non superano i 4000 caratteri E sei su SQL Server 2000 o livello di compatibilità 8 o SQL Server 2000:

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

Per SQL Server 2005 e versioni successive:

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
Solo una domanda veloce, il secondo cast è NTextdavvero necessario? Penso che l'assegnazione NVarchar(MAX)a NTextlo lanci automaticamente.
Tahir Hassan

3
Ottima soluzione semplice. Solo una nota che il 2005+ nvarchar (max) non ha un limite di 4000 caratteri. So che è ovvio (ora, per me), ma prima l'ho letto come se entrambe le risposte avessero quel limite.
goodeye

16

Supponendo che SQL Server 2000, la seguente domanda StackOverflow dovrebbe risolvere il problema.

Se si utilizza SQL Server 2005/2008, è possibile utilizzare il seguente codice (preso da qui ):

select cast(replace(cast(myntext as nvarchar(max)),'find','replace') as ntext)
from myntexttable
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.