Reemplazar un texto en SQL Server con TSQL

9 julio, 2008 por Juan Dejar una respuesta »

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.

Publicidad

24 comentarios

  1. Vedran dice:

    Excelente idea lo del replace para los campos tipo text.
    Eres un crack!!!

    Gracias.

  2. Luis dice:

    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.

  3. admin dice:

    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.

  4. io dice:

    Lo malo es que este sistema trunca los textos de más de 8000 caracteres

  5. juan_M dice:

    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

  6. Juan dice:

    pues tendrias que hacer:
    UPDATE FROM tabla SET campo = (SELECT REPLACE(campo, ‘a’, ‘b’)) WHERE ………

    Creo que con esto deberia de funcionar

  7. juan_M dice:

    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

  8. Juan dice:

    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’

  9. juan_M dice:

    ME PODRIAS AGREGAR A MSN…:D

  10. juan_M dice:

    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

  11. juan_M dice:

    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

  12. juan_M dice:

    era el server que estaba utilizando probe con xampplite y luego reemplace la BD a s2go y funkando

  13. Horus dice:

    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???

  14. Juan dice:

    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.

  15. diana dice:

    podrias agregarme al mesen diana_t_2@hotmail.com

  16. Ariel dice:

    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

  17. Ligia Garcia dice:

    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

  18. ramarti dice:

    gracias!, muy bueno el tutorial, será que hay alguno para que no visualice los campos, para que se menos tiempo de repuesta

  19. ramarti dice:

    gracias, muy bueno el tutorial, será que hay alguno para que no visualice los campos, para que se menos tiempo de repuesta

  20. Eddy_Von_Doom dice:

    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

  21. Juan dice:

    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á.

  22. Ernest dice:

    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 ?

Deja un comentario