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.