Reemplazar un texto en SQL Server con TSQL

Supongamos que tenemos un campo con un texto y lo recuperamos con una consulta SQL. Supongamos también que queremos cambiar parte del contenido de ese texto y reemplazarlo por otro, en este caso realizaríamos un replace por código (programación), pero y si esto no nos vale, y si necesitamos que sea por consulta todo. Para estos casos existe una funcion REPLACE que se ejecuta en SQL y es similar a la de la mayoría de lenguajes de programación.

La llamada a la función de reemplazo (REPLACE) se usara dentro de cualquier código SQL o TSQL en SQL Server. La función REPLACE tiene 3 parámetros, el texto original completo, el texto que se quiere buscar y por último el texto por el que se quiere sustituir como se hace en muchos lengaujes de programación.

La sintaxis sería:

  REPLACE(TEXTO, BUSCADA, SUSTITUIDA)

Un ejemplo de como se incrustaría el reemplazo en una consulta SQL sería:

  SELECT REPLACE(campo, 'a', 'b') FROM tabla

Aqui nos encontramos con el primer de los dos grandes problemas de reemplazar texto con esta función. El primer problema son los campos de tipo TEXT, que al parecer, para SQL Server son objetos diferentes que los campos de tipo CHAR o VARCHAR y para poder reemplazar un campo de tipo TEXT necesitamos hacer un pequeño HACK que nos convierta de tipo TEXT a tipo STRING como si de un VARCHAR se tratase.

El Hack en cuestion se trata de hacer un SUBSTRING desde la primera posición de la cadena hasta la última utilizando la longitud de la misma obtenida con la funcion DATALENGTH. De esta forma, con el SUBSTRING convertimos el tipo TEXT en un tipo STRING o VARCHAR y asi podemos reemplazar.

Un ejemplo seria:

  SELECT REPLACE(
    SUBSTRING(campo, 1, DATALENGTH(campo)),
    'a', 'b') FROM tabla

Y es aquí cuando nos encontramos con el segundo y mayor de los problemas y es la longitud de la cadena. Cuando trabajamos con una cadena de texto realmente larga, como podría ser una página web, el SUBSTRING o el REPLACE no devuelve la cadena completa, por lo que se nos cortara la respuesta y obtendremos solo parte del texto original, eso si, ya reemplazado.

31 comentarios en “Reemplazar un texto en SQL Server con TSQL

  1. Saludos
    Tengo un problemita con una base dadtos, sucede que en mi base de datos tengo unos campos que se encuentran vacios, es decir 'NULL', el problema se da en que cuando trato de hacer consultas desde un aplicativo me da errores tener campos en blanco, como puedo reemplazar estos campos en blanco por un valor cualquiera que yo desee introcudir, desde luego gracias por las posibles respuestas.

  2. Seria cuestion de ver la consulta pero sin saber lo que haces exactamente, es posible que desde el programa estes tratando los campos como un objeto por ejemplo String, pero al ser valores NULL, quizas la aplicacion no este iniciliazando los objetos String teniendo un valor null o Nothing en su interior y al querer acceder a alguna propiedad de objeto es cuando viene el reventon.

  3. quiero reemplazar un trozo de un texto pero no me resulta, osea con el primer ejemplo SELECT REPLACE(campo, 'a', 'b') FROM tabla ,,, me muestra que reemplaza algo pero no lo actualiza... me gustaria saber como podria anidar este REPLACE dentro de un UPDATE ...

    gracias

    1. El ejemplo anterior solo es una consulta de datos a través de cambios de palabras, para actualizar los datos quedando grabados en la base de datos debes de utilizar UPDATE.

  4. si por ahi va, pero en WHERE que debiera ser la condicion, nose cual es la condicion si pretendo reemplazar un trozo de texto dentro de ese campo solamente... y eso estaria dado en la sintaxis de REPLACE...

    GRACIAS

  5. Supongamos que tienes una tabla con id's, y lo que quieres es actualizar un campo de esa tabla haciendo el replace. La consulta quedaria tal que

    UPDATE tabla SET campo = (SELECT REPLACE(campo, ‘a’, ‘b’) FROM tabla WHERE id = 'valorId') WHERE id = 'valorId'

  6. UPDATE object SET installpath = (SELECT REPLACE( installpath, 'instalar.bat', 'instalar_ad.bat' ))

    esa era la sentencia ya que necesitaba actualizar el campo installpath en todos los registros de la tabla... muchas gracias

    1. Hola, para que esa consulta funcione hay que quitarle el Select, de lo contrario dará un error diciendo que no se puede actualizar porque devuelve mucho valores, si por ejemplo es como mi caso que la cadena estaba en múltiples registros. Espero que a alguien le ayude. Gracias.

  7. UTA SIGO CON PROBLEMAS... ESTOY TRABAJANDO EN UN SERVER LOCAL (SERVER2GO) Y CON ESA SENTENCIA ME GENERA LA MODIFICACION Y TODO BIEN MIENTRAS NO CIERRE EL SERVER... PERO AL CERRAR Y VOLVER A ABRIR LAS MODIFICACIONES NO SE REFELEJAN... SI ALGUIEN TUVIESE ALGO QUE APORTAR SE LO AGRADECERIA...

    GRACIAS

  8. Me parece bien todas las observaciones, pero como se puede grabar en el campo mas de 8000 caracteres?

    Se me ocurre llevarlo a variables de tipo texto y luego recien grabarlo al campo.

    update tabla set campo = cad1 + cad2 + cad3 where condicion

    donde cad1, cad2, cad3 soporta cada uno (8000) osea tendriamos para grabar 24000 caracteres; podria ser????

    Algun comentario de algun experto???

  9. Pues mira Horus, depende mucho de para que utilices ese campo, pero en mi experiencia como desarrollador, te puedo decir que tener un campo tan grande es un error. Si ese campo es un texto, un articulo, un post o algo similar, por ese tamaño, quizas fuera recomendable guardarlos en archivos fisicos, en la base de datos tienes los ids y los archivos fisicos tienen el nombre de esos ids, asi por codigo puedes acceder a ellos.

    Te lo digo porque aunque en SQL Server no lo he llegado a probar, en la mayoria de bases de datos, tienden a ralentizarse si tienen campos muy grandes, aunque no accedas directamente a ellos y quizas te fuera mejor guardarlos en archivos fisicos para evitar bloqueos y agilizar consultas.

  10. Respecto de la consulta de los 8000 caracteres.
    SQL Server desde su version 2005 implementa un tipo de dato llamado nvarchar(max), este tipo de campo puede almacenar hasta 2GB de informacion en texto, pero funciona guardando esa informacion en el disco y en el campo que definiste con ese tipo de datos en realidad almacena un puntero al disco, si es inevitable que lo uses como campo de texto esa seria la opcion correcta segun mi experiencia.
    Otra opcion que tienes es serializar la informacion antes de guardarla, comprimirla (esto en tu aplicacion) y mandarla a un campo de tipo Image, pero vas a complejizar tu desarrollo.
    Ahora..., si por lo que leo, lo que lo esta truncando es el mismo sistema antes de que llegue a la DB, lo que te conviene hacer es "partir " esa informacion y guardarla en varios registros en otra tabla y relacionarlos luego, algo asi como varios renglones o registros de 7999 caracteres por cada un solo registro de texto (use mucho esta opcion cuando Crystal Reports tenia prblemas con longitud de campos en su version 4.5 )
    Espero que te ayude
    Ariel

  11. Buenos dias, tengo es siguiente problema, tengo una consulta que regresa en un solo campo, el cual es mayor de longitud a 4000, el problema que tengo es que Crystal lo trunca a 2500, tengo una version XI

  12. Un tema interesante , me sirvió bastante, pero me deja con una duda, estoy trabajando con un web service que me devuelve un nombre totalmente en ingles, lo guardo en mi BD que es sql 2008 r2, y uso un trigger Update para hacer el replace los pase en español, pero se puede hacer concatenar con un campo de otra tabla . se que suena fumado o loco , p ero esa es mi duda.

    Espero tu pronta respuesta.

    Saludos

  13. Hola Eddy

    No es fumado ni mucho menos, es utilizar la base de datos que para algo esta. Para concatenar en SQL Server 2 strings es tan sencillo como hacer algo del estilo de:

    select tabla1.campo1 + ' ' + tabla2.campo2, *
    from tabla1 inner join tabla2 on tabla1.id = tabla2.foranea

    Fijate como utilizando los símbolos de +, es decir, de suma, concatena strings. Luego si esa misma consulta la pasas con un paréntesis al replace, te reemplazará.

  14. hola me pueden ayudar por favor me puedes ayudar tengo varios registos asi

    [Campo] --- Calle
    Av Insurgents 2
    Prol insurgetes 208
    Calle insurgete 38

    Y quiero reemplazar todo lo que empiece por INS CAMBIARLO POR LA PALABRA "INSURGENTES"

    Se podria de alguna forma ?

    No especificando cada caso o cada error de ortografia ?

    Ayudame amiguito llevo toda la semana y no puedo hacerlo

    UPDATE CONCENTRADO SET ADDR = Replace (ADDR, 'INS','INSURGENTES ')

    PERO ME DA DE RESULTADO LO SIGUIENTE:

    Av Insurgetes nts 2
    Prol insurgentes tes 208
    Calle insurgentes te 38

    me ayudas pls ?

  15. estoy realizando unos reportes en coldfusion report builder y al ingresar un query me aparece el codigo html visualizado como hago para que simplemente aparezca el texto

  16. Por favor alguien me puede ayudar en lo siguiente:
    En una BD llamada ENTIDAD, debo actualizar parte de un Campo llamado DIRECCION en el cual se encuentra información tal como:

    AV. 15 # 5-76
    Avenida 26 Nro.36-81
    Avda. 24 Nro.12-18.

    En específico deseo unificar la expresiones iniciales (AV. , Anevida y Avda) a la palabra "Avenida". Por favor, qué debo hacer?

  17. Muy bueno. Pase un rato con ese problema.

    Para cambiar datos o caracteres en una tabla seria:

    UPDATE tabla SET campo = REPLACE(
    SUBSTRING(campo, 1, DATALENGTH(campo)),
    'dato a reemplazar', 'dato nuevo')

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *