Monthly Archives: Julio 2008

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.

Autocomplete=”off” valido para XHTML

Cuando escribimos un texto en un input de tipo text (input type="text") nos encontramos que por regla general el navegador nos va a autocompletar lo que estemos escribiendo en ese momento con texto que ya hayamos escrito con anterioridad, recordando para un input que se llama "nombre" el o los nombres que hayamos introducido.

La practica del autocompletado es muy util siempre que tengamos formularios repetitivos, tales como los formularios de registro que suelen llamarse siempre de forma similar y siempre suelen pedir los mismos datos, evitandonos volver a escribir todos nuestros datos una y otra vez.

Existen casos en los que quizas no queramos que el navegador nos autocomplete ese texto, puede darse el caso que tengamos una tienda online que realiza el pago con tarjeta de crédito y no queramos que esa tarjeta de crédito se nos autocomplete. Para evitar esto, existe un atributo que es utilizado por la gran mayoria de los navegadores que es el atributo autocomplete="on|off", que si se desactiva con el valor off, indica al navegador que no ha de autocompletar ese campo.

Aunque en muchos casos es muy buena practica usar el atributo autocomplete, el W3C no tiene reconocido este atributo como atributo de la etiqueta input, con lo cual al intentar validar y encontrarse con el atributo autocomplete, nos dara un error de validación. Para solucionar el error de validación lo que haremos sera utilizar javascript para añadir este atributo, así la funcionalidad seguira estando ahí, pero no tendremos problemas de validación.

Lo unico que deberemos hacer es añadir el siguiente código al final de la página, o al menos, justo despues de declarar el input

  

De esta forma conseguiremos que al introducir un texto en un input no se autocomplete por el navegador y si queremos autocompletar lo podamos hacer por javascript.

Un buen y bonito ejemplo de autocompletado de campos es el que use para muchoviaje en los campos de origen y destino

Evitar bloquear una tabla en SQL Server

En muchos casos es necesario hacer consultas hacia la base de datos que requieren de algo de tiempo para completarse, por ejemplo consultas estadisticas. En estos casos, suele ocurrir que SQL Server puede bloquear la tabla evitando que ningún otro hilo realice consultas sobre la misma hasta que la primera consulta haya finalizado, pudiendo provocar esto una considerable lentitud en una página web o una aplicación que utilicen bastantes personas.

Existe para SQL Server un ABS, un sistema para que a la hora de realizar una consulta, evitar que esta bloquee la tabla y asi nuestra aplicación siga funcionando correctamente mientras por detras se esta realizando la consulta tediosa que en otras circunstancias nos bloquearia la tabla.

Para evitar bloquear la tabla se ha de poner with(nolock) justo despues del nombre de la tabla, por ejemplo:

SELECT * FROM tabla with(nolock)

Esto es algo muy util ya que bien porque se nos olivde o simplemente porque no se conozca es muy util tenerlo a mano para utilizarlo en casi todas las consultas que son algo tediosas.

Segundo parón mensual

De nuevo y como ya sucedio el mes pasado, mi jefe tuvo la genial idea de que podiamos hacer un proyecto de 3 a 6 meses de desarrollo en tan solo 1 mes. Pero al fin se ha terminado y ya puedo respirar tranquilo, espero que durante al menos unas semanas que aprovechare para ir escribiendo articulolillos para el blog que tengo alguno que otro preparadete.