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.