Buscar este blog

martes, 30 de noviembre de 2010

Que inserte, actualice o elimine??

Desde hace unos días atrás estoy publicando varias cosas nuevas con respecto a la base de datos MS SQL Server que existían y no lo sabía, y si quizás lo hubiera sabido antes, me hubiera ahorrado muchas horas de codificación o de análisis de cómo sacarle la vuelta a la herramienta.

El día de hoy aprendí que las sentencias insert, update y delete, cuentan con una clausula opcional llamada "OUTPUT", esta clausula es muy útil cuando luego de un insert, uno desea saber que registros fueron afectados por la operación DML.

Para obtener este resultado, antes yo hacia un select antes de la operación y lo guardaba en una tabla temporal y luego utilizaba esta data para hacer otras operaciones, pero esto no es bueno para la performance de la base de datos debido a que se está ejecutando el mismo comando select 2 veces, 1 para guardar los resultados de los registro, y otra vez para ejecutar la operación DML. Otro de los defectos de esta técnica es que hay la posibilidad de que los datos no calcen debido a que en la ejecución del primer select, la base de datos me arroje 3 registros, luego justo antes del insert otra sesión inserta un registro más en la tabla y esto hace que el select que se ejecutara en la sesión original para la operación DML ya no arroje 3 registros sino 4, y entonces nuestra técnica fallo.

No sería bueno que la base de datos nos de la posibilidad de tener los registros afectados por una operación DML, sin afectar la performance y sin la posibilidad de error en el numero de registros. Pues si la hay y es la clausula OUTPUT que tienen todas las operaciones DML (insert, delete, update y merge). Para dar más detalle de esta clausula opcional y su funcionamiento, recomiendo leer este
link que contiene la documentación oficial y es bastante completa.

Bueno espero seguir aportando con característica, funciones, sps, etc. que se encuentran ahí pero aun no los vemos.

martes, 23 de noviembre de 2010

Soundex y Difference

Hay ocaciones que uno se siente que le falta tanto por conocer, cuando descubres funciones que ya existen y tu nunca las conociste y que quizas te pudieron salvar de muchas horas de codificacion o de malas respuestas que pudiste haber dado.

Este es el caso de las funciones SOUNDEX y DIFFERENCE, estas dos funciones en SQL Server son muy potentes al momento de estandarizar data que quizas se tiene de forma plana en un texto.

Bueno les dejo el siguiente link que describe muy bien el uso de estas funciones. Espero sea de ayuda.

domingo, 21 de noviembre de 2010

Excel query pierde valores

Hace relativamente corto tiempo tuve un problema un poco dificil de resolver con MS excel. Estaba realizando cargas masivas a una base de datos SQL Server a partir de un archivo excel en mi PC de desarrollo (32 bits), aparentemente la carga pasaba correctamente y no se presentaban problemas. Pero al llevar mi script para la carga al servidor del cliente (64 bits) y luego ejecutar otro script de verificacion de duplicados, detecte mas de 300 registros duplicados, lo cual me parecio muy extraño.

Revise mi archivo excel para comprobar los duplicados reportados en el cliente y efectivamente habian varios registros duplicados. Entonces me apresure a ejecutar un query directo sobre el archivo excel en mi pc de desarrollo y vi que una columna siempre aparecia con valores null a pesar que en algunas celdas si tenia valores numericos.

Luego de investigar un poco me encontre con que el driver de MS Excel para 32 bits intenta obtener el tipo de dato de la columna que se esta seleccionando a partir de un numero determinado de filas definido en el regedit. Al parecer si no encuentra valores en esa columna hasta alcanzar el numero de fila definido en el regedit le asigna un valor texto, y cuando mas adelante en el query encuentra numeros los coloca como null. Esto me di cuenta porque edite el archivo excel y coloque como tipo de dato de la columna, texto, y modifique el valor de una celda hasta que apareciera el bendito triangulo verde en la esquina de la celda. Volvi a lanzar el query y solo me mostro valor en esa columna para la celda que habia modificado.

Para solucionar este problema tuve que modificar el parametro del regedit que se encuentra en el siguiente key "
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel ", el nombre del parametro es "TypeGuessRows" el valor de este parametro por defecto es 8, lo tuve que colocar en 0 para que tome todas las filas del excel para determinar el tipo de dato de la columna. Con este cambio realizado ya no perdi los valores que se encontraban en las celdas del excel.