alternativas a REPLACE en un tipo de datos text o ntext


101

Necesito actualizar / reemplazar los datos en datatable.column. La tabla tiene un campo llamado Content. Estoy usando la REPLACEfunción. Dado que el tipo de datos de la columna es NTEXT, SQL Server no me permite usar la REPLACEfunción.

No puedo cambiar el tipo de datos porque esta base de datos es una tabla de software de terceros. Cambiar el tipo de datos hará que la aplicación falle.

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

Recibo este error:

Msg 8116, Nivel 16, Estado 1, Línea 1 El tipo de datos de argumento ntext no es válido para el argumento 1 de la función de reemplazo.

  • ¿Puedo arreglar esto con T-SQL? ¿Alguien tiene un ejemplo de cómo leer y hacer un bucle?
  • Dado que esta es una conversión única, tal vez pueda cambiar a otro tipo, pero me temo que estoy estropeando los datos.

Hay un campo de clave principal: nombre: ID - entero - es una identidad ... Así que también necesito pensar en esto. Quizás establezca la Identidad en N temporalmente.

Por favor, infórmese sobre cómo lograr la función REPLACE.

Aprox. 3000 declaraciones deben actualizarse con una nueva solución.


¿Es esto SQL Server 2000?
p

RESPUESTA: Estoy usando SQL2008 ... y la BASE DE DATOS tiene un nivel de compatibilidad 2000 (80). Si cambio esto también en 2008, ¿funcionará? ya que no conozco las consecuencias todavía salí en el nivel de compatibilidad 2000, pero es SQL 2008 Database. esta es una conversión de una sola vez ...
ethem

Respuestas:


197

SI sus datos no superan los 4000 caracteres Y está en SQL Server 2000 o nivel de compatibilidad de 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%' 

Para 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
Solo una pregunta rápida, ¿es NTextrealmente necesario el segundo elenco ? Me gustaría pensar que la asignación NVarchar(MAX)a NTextproyectaría automáticamente.
Tahir Hassan

3
Gran solución simple. Solo una nota que el 2005+ nvarchar (max) no tiene un límite de 4000 caracteres. Sé que es obvio (ahora, para mí), pero primero lo leí como si ambas respuestas tuvieran ese límite.
goodeye

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.