19 enero 2013

Asignar el valor de una variable desde una consulta

Una operación normal dentro de funciones y procedimientos en SQL Server es asignarle a una variable el resultado de una consulta, existen dos métodos, uno es asignar el valor a la variable directamente dentro de la consulta:


SELECT TOP@var1 = EmployeeID FROM dbo.Employees WHERE LastName = ''


El otro método es usando la instrucción SET


SET @var1 =  (SELECT TOP 1 EmployeeID FROM dbo.Employees WHERE LastName = '')


El problema que suele presentarse es que los dos métodos tienen diferente manera de comportarse en lo que se refiere al valor de la variable si la consulta no retorna ningún resultado, si revisamos el primer caso y partiendo de que la consulta no retorna ningún valor (base de datos Northwind)


DECLARE @var1 INT

SET @var1 = 0

SELECT TOP 1 @var1 = EmployeeID FROM dbo.Employees WHERE LastName = ''

SELECT @var1


El resultado es:



-----------
0

(1 row(s) affected)


Esto quiere decir que conserva el valor que se le asigno a la variable antes de usarla en la consulta, si revisamos el otro método:


SET @var1 = 0

SET @var1 =  (SELECT TOP 1 EmployeeID FROM dbo.Employees WHERE LastName = '')

SELECT @var1


el resultado es:



-----------
NULL

(1 row(s) affected)


Esto es, aun cuando a la variable se le asigno el valor 0 al inicio, al momento de la segunda asignación y ya que esta consulta no retorna ningún valor, SQL Server la cambia a NULL


Conocer esto y tenerlo en cuenta nos ayudara a impedir posibles errores, una forma es nunca dejar de usar el ISNULL en el manejo de nuestras variables asignando valores default cuando sea posible.

Espero que sea de tu interés o que te haya ayudado a solucionar algun problema que se te este presentando

15 enero 2013

Determinar cuantos registros tiene una tabla de SQL server

y ,de paso, como mejorar los tiempos de consulta.


Saber cuantos detalles se encuentran insertados en una tabla en SQL Server es una operación que hacemos por diferentes motivos, generar estadísticas para el usuario o hacer una validación, por ejemplo.

Hacer el conteo del total de registros de una tabla en especifico se puede hacer con la instrucción COUNT(*)

Ejemplo, dada una tabla con nombre registros lanzamos la consulta


SELECT COUNT(*) FROM dbo.registros


Esto nos retornara la cantidad de elementos, en este ejemplo 100,000 detalles















Hasta aquí todo es perfecto, sin embargo, como maniáticos de la mejora de nuestro sistema nos encontramos que este tipo de consultas es Lento con L mayúscula,  si estamos generando este tipo de consultas sobre tablas realmente grandes nos estaremos encontrando con que generamos una carga a nuestro motor de base de datos.

Entonces nos preguntamos, como agilizar esto?, pues si no necesitas el resultado exacto el 100 % del tiempo (bajo algunas circunstancias algo excepcionales puede diferir), nos aprovechamos de la tabla    sysindexes en donde se almacena la columna rows  con la cantidad de detalles, si hacemos las consultas:


SELECT COUNT(*) FROM dbo.registros

SELECT TOP 1 rows FROM sysindexes
INNER JOIN sys.sysobjects ON sys.sysindexes.id = sys.sysobjects.id
WHERE sys.sysobjects.xtype = 'U' AND sys.sysobjects.name = 'registros'
ORDER BY sysindexes.indid


Nos genera el mismo resultado:












Con una gran diferencia, si miramos el Execution plan de estas dos consultas los notamos




























95% contra el 5% del tiempo total de consulta, una gran diferencia que nos ayudara a acelerar nuestros procesos

Espero te sirva el  truco y te ayude en lo que estés desarrollando








12 diciembre 2012

Ok

Son las 12:12 del 12/12/12*

*tiempo del pacifico

28 noviembre 2012

Programas necesarios, si no que indispensables


Ser programador es casi sinónimo de estar pegados a un monitor entre 8 y 24 al día ( se dice que algunos programadores pueden estar 26 horas al día haciendo debug del código de otros, pero solo es una leyenda).

He escuchado por ahi que nuestro equipo es la herramienta de nuestro trabajo, en lo personal no encuentro acertado este simil, para mi es mas bien la caja donde tenemos las herramientas, y depende de lo que tengamos ahi sera el que podamos realizar nuestro trabajo de una forma mas eficiente.

Para los programadores de la vieja escuela tengo aquí los programas que me ayudan a optimizar mis actividades, me ahorran tiempo y simplifican la vida:

Y lo mas importante son Freeware!!

22 noviembre 2012

Buscar un Campo en la base de datos

O mejor, como buscar todos los campos con un nombre en especifico?

Ya sea que la base de datos no la hallamos desarrollado nosotros y tengamos que buscar cierta informacion en ella, o bien que seamos muchos los que hacemos cambios en la base de datos y estemos buscando determinado campo, ya sea que nos interese saber en que tablas se hace referencia a determinado campo o simplemente no recordamos donde dimos de alta un campo en especifico, a veces tenemos que buscar en las tablas.

Hacer esto tabla por tabla es monótono, sujeto a errores y tardado, para ayudarnos con esto nos apoyaremos en las tablas de sistema sys.sysobjects, sys.syscolumns y sys.systypes, en la primera podemos encontrar las tablas que hemos dado de alta, en la segunda los nombres de sus columnas y en la ultima podemos obtener el tipo de dato de la columna, el resto es cuestión de hacer la consulta apropiada, tomando como ejemplo la base de datos Northwind:


SELECT  tbl.name AS [Tabla],
          tbl.xtype,        
        col.name AS [Campo] ,
        sys.systypes.name AS [Tipo de Dato]
FROM    sys.sysobjects tbl
        INNER JOIN sys.syscolumns col ON 
                tbl.id = col.id
        INNER JOIN sys.systypes ON 
                col.xtype = sys.systypes.xusertype
WHERE   col.name LIKE '%Category%' AND
        tbl.xtype IN ('U','V')
ORDER BY tbl.xtype, tbl.name , col.name



Esto nos retornara la siguiente informacion:

Tabla xtype Campo Tipo de Dato
Categories CategoryID int
Categories CategoryName nvarchar
Products CategoryID int
Alphabetical list of products CategoryID int
Alphabetical list of products CategoryName nvarchar
Category Sales for 1997 CategoryName nvarchar
Category Sales for 1997 CategorySales money
Product Sales for 1997 CategoryName nvarchar
Products by Category CategoryName nvarchar
Sales by Category CategoryID int
Sales by Category CategoryName nvarchar



En esta consulta obtenemos todas las tablas de usuario y vistas que contienen un campo cuyo nombre tiene la palabra Category como parte de el.

Poniéndole un poco de imaginación esta consulta nos puede servir para otras cosas que no sean simplemente buscar campos, por ejemplo, hace tiempo tuve que cambiar todos los tipos de datos FLOAT por DECIMAL, basándome en esta consulta arme un cursor que recorría todos los campos de ese tiempo armando un ALTER TABLE y ejecutándolo, ahorrándome así bastante tiempo.

Espero te sirva la información.

20 noviembre 2012

Como nombrar las tablas en mi base de datos

Database
Una buena practica es normalizar tu base de datos tanto como sea posible (corre la leyenda que si llegas al tercer grado de normalización con tu BD te regalan 1000 consultas gratis en google), pero adicional a eso hay algunas buenas practicas que seguir para facilitarte la vida como programador.

Agrega un prefijo a tus tablas para separar los diferentes módulos de tu sistema. Porque? porque si la suerte te sonríe y tu sistema crece hasta tener 400 tablas buscar una en especifico te estará consumiendo tiempo que seguramente no tendrás,  por ejemplo, separar las tablas de configuraciones con el prefijo CONF_ de las tablas de catálogos con prefijo CAT_ hará que el manejador que estés usando las ordene por default de forma separada.

Agrega un prefijo a los nombres de los campos de una tabla en función a la tabla que pertenecen. Porque?, porque cuando tu sistema crezca y empieces a usar consultas cada vez mas complicadas para generar grandes reportes que te soliciten tus usuarios es de gran ayuda identificar a primera vista el origen de un campo por solo su nombre, por ejemplo, si tienes una tabla de chóferes y otra tabla de visitantes y las dos tienen el campo Nombre, es mucho mas fácil identificar los campos si los nombras CHOF_Nombre y VIST_Nombre cuando estos estén dentro de una consulta complicada.

Los campos llave de las tablas nombrarlos igual en las tablas donde se haga referencia a ellos. Esta simple practica te hara ahorrar bastante tiempo a la hora de identificar por que campo se liga una tabla con otra, por ejemplo y siguiendo con el ejemplo de la tabla de choferes, si un vehículo tiene asignado un chofer en tu base de datos y el campo llave de la tabla de choferes es CHOF_ID, el campo en la tabla de vehículos nombralo también CHOF_ID, asi cuando se haga una liga en un INNER JOIN la condición quedaría:
CAT_Vehiculos.CHOF_ID = CAT_Choferes.CHOF_ID
 Ademas de facilitarte la vida agrega mas simplicidad a las consultas.

Define desde un inicio si vas a usar nombres en plural o en singular para nombrar tus tablas y apegate a ese modo. Si se te hace mas fácil llamar a tu tabla CAT_Choferes o CAT_Chofer quedate con ese estándar para todas tus tablas, asi evitaras tener que acordarte después al momento de hacer una consulta si tu tabla lleva una S o no al final, pareciera una tontería pero en volumen disminuye la cantidad de errores al momento de escribir nuestro codigo

Con estos simples consejos tu yo del futuro te estará muy agradecido.

19 noviembre 2012

Visto desde el lado del usuario

Hace un par de días  un usuario del sistema que desarrollo me hizo una solicitud, en una pantalla de búsqueda de números de parte al momento de hacer una factura le gustaría que por default apareciera el control en la caja de texto de la herramienta de búsqueda.

Pues si, no solo es mejor, si no que ademas es la opción lógica, en un entorno de produccion los usuarios captura un aproximado de 1500 detalles de factura si pierden un segundo en mover el mouse entre las opciones ya tenemos una mejora de 25 minutos.

En ocasiones los programadores novatos nos enfocamos en mejorar procesos mas llamativos y podemos llegar a perder la visibilidad de este tipo de cosas.

A partir de ahora me tomare el tiempo de ver el sistema desde el punto de vista del usuario

02 noviembre 2012

La red 1.0 ya era social antes de


ó, la red 2.0 ya me tiene hasta los $#%#$%
ó, Soy community manager porque subo fotos al face del trabajo
ó, Metele un botón de compartir en twitter, otro de facebook, otro de Google+, otro de instagram, otro para delicious, otro de meneame, otro de stumbleupon, otro de tuenti, después bailas la danza de la lluvia modificada para ver si nos llega a caer una visita.

Hazme un favor y mira esta consulta en Google: consulta en google

Después de ver la cantidad de paginas en facebook de marcas de papel higiénico, dime: en nombre de Cthulhu quien en su sano juicio desearía estar al tanto en su timeline de facebook acerca de las ultimas novedades de su marca de papel higiénico favorito??!!!!

Es que eso de la red 2.0 se nos esta yendo de las manos.

A modo de ejemplo y de duda: deberían ser todas las paginas e internet ser sujetas a ese proceso dospuntocerista?, donde a huevo le tienes que meter una capa social a riesgo de ser tachado de retrogrado y unopuntocerista. Esto ultimo de los peores insultos que les puedes proferir a un community manager, por cierto.

Es cierto que si estoy viendo un vídeo en youtube lo quiera compartir con mis amigos de mi red social favorita, ya sea por que me causo gracia, ya sea por que quiero que sepan que escucho buena música y soy cool por ello. pero de ahí hay mucho camino a que un día este leyendo acerca del método de condensación pivotal y de pronto me diga: "Hey, esto es harto interesante, rápido , compártelo en twitter, chanse y se hace treding topic".

Es probable que esta observación de lo sobresaturado que esta la red de todo este rollo de comunidades, redes, amigos, compartir, +1s, "regalarme un like por el amor a monesvol" , se deba a que soy del tiempo del IRC, grupos de correo, altavista y mi pobre mente noventera no alcance a ver lo maravillosamente perfecta que es internet donde hasta las paginas porno tienen un share en facebook.

Pero también es probable que todo este hacinamiento de redes sociales solo sea la ultima fase de la burbuja 2.0 y lo que en realidad pasara este diciembre es que de pronto todos regresaremos a los grupos de correo, foros y paginas en lycos.



Las imágenes vienen de:
http://www.josemiruiz.com/
http://tecnologia.tedateo.com

31 octubre 2012

Yo mataba lagartijas

De un tiempo para acá he mirado como ciertos comportamientos que consideraba normales pasaron a formar parte de la lista de cosas que "son malas para los niños".

Por ejemplo, en mis tiempos los niños matábamos animales, lagartijas, pájaros pequeños, arañas, abejas, era de los pocos pasatiempos que tienes cuando vives en el campo.

En las tardes, preparábamos el tirador (hay quien los llama tirachinas / resortera, en mi tierra les llaman simplemente tiradores), tardábamos 1 hora buscando piedras que cumplieran con los requisitos para usarlas como proyectiles (tamaño, textura, forma) y después pasábamos otro par de horas en plan de caza en las zonas cercanas, para deleite del gato de la casa que era el que terminaba disfrutando del resultado.

Pues ahora me encuentro con que eso es un comportamiento propio de futuros psicópatas/delincuentes/políticos/asesinos seriales. Bueno pues, lo de políticos yo lo he puesto solo para acentuar lo malo que seras si de niño matas animalitos...

Estoy confundido, creo que la mayoría de los que conocí de niño terminamos siendo padres de familia trabajadores que pagamos impuestos y le damos el pase a las personas en los cruceros, varias generaciones antes que la nuestra crecieron así y el resultado es esta sociedad lo suficientemente civilizada para ahora cuestionar a las anteriores, por barbaras e incivilizadas.




23 abril 2012

Debate Presidencial 2012

Sirva este post para mostrar mi apoyo a las palabras de  Pedro Arturo Aguirre. No creo que peña nieto pudiese ganar un debate con los otros candidatos, pero tampoco creo que Andres o Josefina pudiesen llegar a ganarlo, Como se comenta en el articulo, México no es un país de estadistas aptos para el debate... Hasta en eso estamos jodidos, vapuleos verbales y adjetivos sonoros esos si, pero argumentación?? HECF.







Pero otra cosa, y aqui peco de ignorante, se me podría explicar porque yo, un simple ciudadano, habría de calificar el futuro desempeño de un político en base a su éxito en un debate?. SI mañana hay que modificar /ajustar la política económica del país en base al éxito/fracaso de nuestra industria turística/petrolera /textil/servicios de que me sirve que mi presidente sea un gallo con los debates?que sentido practico tienen una rápida respuesta verbal cuando las decisiones que se toman en presidencia deberían de ser pensadas con detenimiento pues afectaran a millones de personas?