Buscar este blog

31 mayo 2011

Cambiar precisión de columnas decimal

No les pasó alguna vez que subestimaron el tamaño de una columna tipo decimal? y despues no sabían por qué empezaron a desbordarse por doquier!?. Bueno les hice un pequeño script t-sql que les va a solucionar la vida.

En mi caso quería cambiar todas las columnas de precisión (10,4) a (18,4) ya que en realidad SQL Server utiliza la misma cantidad de bytes (9 bytes) para almacenar cualquiera de estas dos configuraciones del tipo decimal, con lo cual en estos casos conviene utilizar la máxima precisión posible dentro de cada rango especificado en este enlace donde podrán ver la tabla que muestra la relación precisión - tamaño en bytes.

También en el enlace anterior se explica para los que no saben, que la precisión es la cantidad total de dígitos a almacenar y la escala, que es opcional, indica la cantidad de posiciones decimales.
Por ejemplo 10,2 significa 10 dígitos en total de los cuales 8 son enteros y 2 decimales.

El sript convierte todos los campos decimal de la base de datos que este en uso al momento de su ejecución a su máxima precisión para el numero de bytes actual que esta ocupando, también incrementa los lugares decimales de 2 a 4 dígitos. Se puede modificar fácilmente este script para que por ejemplo aumente todos los campos decimal a una precisión deseada o cualquier otra condición que sea necesaria, la base está... a meterle mano sin miedo (previo backup y en ambiente de testing)

-- VARIABLES
DECLARE @tblName0 NVARCHAR(150)
DECLARE @tblName NVARCHAR(150)
DECLARE @colName NVARCHAR(150)
DECLARE @colDataType NVARCHAR(50)
DECLARE @colNumericPrecision NUMERIC
DECLARE @colNumericScale NUMERIC
DECLARE @colIsNullable CHAR(3)
DECLARE @cont int
-- CURSOR
DECLARE cur_tables CURSOR FOR
select t.table_name, column_name, data_type,
numeric_precision, numeric_scale, is_nullable
from information_schema.columns c
inner join information_schema.tables t
on c.table_name=t.table_name
and table_type='BASE TABLE'
and data_type='decimal'
OPEN cur_tables
FETCH NEXT FROM cur_tables INTO @tblName, @colName, @colDataType,
@colNumericPrecision, @colNumericScale, @colIsNullable
SET @tblName0=''
SET @cont=0
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Precision VARCHAR(2)
DECLARE @Scale VARCHAR(2)
DECLARE @Nulls VARCHAR(10)

-- Máxima precisión posible sin aumentar
-- la cantidad de bytes necesarios.
IF @colNumericPrecision <= 9
SET @Precision = '9'
ELSE IF @colNumericPrecision <= 19
SET @Precision = '19'
ELSE IF @colNumericPrecision <= 28
SET @Precision = '28'
ELSE IF @colNumericPrecision <= 38
SET @Precision = '38'
-- Incrementar a 4 decimales
IF @colNumericScale < 4
SET @Scale = '4'
ELSE
SET @Scale = CAST(@colNumericScale as VARCHAR(2))

-- ES NECESARIO CAMBIAR LA COLUMNA?
IF (@colNumericPrecision <> CAST(@Precision as NUMERIC) OR
@colNumericScale <> CAST(@Scale as NUMERIC))
BEGIN
IF @colIsNullable='YES'
SET @Nulls = 'null'
ELSE
SET @Nulls = 'not null'

EXEC('alter table ' + @tblName +
' alter column ' + @colName + ' decimal(' + @Precision + ',' + @Scale + ') ' + @Nulls)
SET @cont=@cont+1
IF @tblName<>@tblName0
BEGIN
SET @tblName0=@tblName
PRINT '--------------------'
PRINT @tblName
PRINT '--------------------'
END
PRINT char(9) + @colName + ' se ha cambiado de: ' + @colDataType +
'('+ cast(@colNumericPrecision as nvarchar(50)) + ',' +
cast(@colNumericScale as nvarchar(50)) + ')' +
' a decimal(' + @Precision + ',' + @Scale + ') '
END --IF
-- OBTENER SIGUIENTE COLUMNA A TRATAR
FETCH NEXT FROM cur_tables INTO @tblName, @colName, @colDataType,
@colNumericPrecision, @colNumericScale, @colIsNullable
END
PRINT '----------------------------------------------------------'
PRINT cast(@cont as nvarchar(10)) + ' columnas afectadas.'
CLOSE cur_tables
DEALLOCATE cur_tables

Si sos principiante aquí vimos varias cosas que te recomiendo leer antes de intentar cualquier cosa: manejo de cursores, estructuras condicionales, consultas a las vistas de información de esquema y la instrucción EXEC[UTE].
Hasta la próxima!

27 mayo 2011

Información sobre un objeto

Para los que usamos alguna vez Oracle sabemos que con el comando DESC[RIBE] obtenemos información acerca de una tabla en particular, ahora bien para SQL Server, no existe tal comando con lo cual buscando encontré un pequeño pero útil procedimiento almacenado que cumple dicha función, este es sp_help.
¿Cómo lo usamos?

exec sp_help ó simplemente sp_help

Lo interesante es que no solo brinda información sobre tablas sino que también sobre stored procedures (muy util para ver que parámetros recibe de que tipo y que resultado devuelve), vistas, triggers, funciones, y cualquier otro objeto de nuestra base de datos.

Probar sp_help sp_help
...y como es de esperar sp_help nos brindará información sobre sí mismo ya que es un procedimiento almacenado más...

Es una pavada pero a alguien le podría servir. Hasta la próxima.

11 abril 2011

Herramienta para gestión de proyectos


Quería compartir una aplicación muy piola y potente que nos permite elaborar y compartir proyectos, importar desde MS Project, exportar a diferentes formatos, integrarlo con Google Docs, y muchas cosas mas. Se trata de Gantter, aplicación web 2.0 totalmente interactiva y ágil disponible en 11 idiomas, se puede acceder mediante su sitio web o agregarlo a nuestro navegador como una extensión de Firefox o Chrome.
Ah! me olvidaba, es completamente gratuita!

17 febrero 2011

Anti-patrones de diseño


Así como existen los Patrones de diseño existen una serie de anti-patrones de diseño, los cuales nos permiten evitar ciertos errores o caminos desfavorables a la hora de diseñar, planificar e implementar un proyecto de software. A pesar de tener nombres muy graciosos estoy seguro que alguna vez te topaste con alguno de ellos:

Pollo sin cabeza (headless chicken): Se aplica al gestor, coordinador o responsable que vive en una permanente situación de pánico y medidas desesperadas.
Caballero de tres cabezas (three-headed knight): Gestor indeciso, poco firme, dubitativo.
Humo y espejos (smoke and mirrors): Mostrar cómo será una funcionalidad antes de que esté implementada.
Mala gestión (bad management): Gestionar un proyecto sin tener suficientes conocimientos sobre la materia.
Software inflado (software bloat): Permitir que las sucesivas versiones de un sistema exijan cada vez más recursos.
Fábrica de combustible (gas factory): Diseñar de manera innecesariamente compleja.
Gran bola de lodo (big ball of mud): Construir un sistema sin estructura definida.
Problema del yoyó (yo-yo problem): Construir estructuras (por ejemplo, de herencia) que son difíciles de comprender debido a su excesiva fragmentación.
Singletonitis: Abuso de la utilización del patrón singleton.
Ancla del barco (boat anchor): Retener partes del sistema que ya no tienen utilidad.
Desarrollo conducido por quien prueba (tester driven development): Permitir que un proyecto software avance a base de extraer sus nuevos requisitos de los informes de errores.
Avance del alcance (scope creep): Permitir que el alcance de un proyecto crezca sin el control adecuado.
Funcionalitis acechante (creeping featuritis): Añadir nuevas funcionalidades al sistema en detrimento de su calidad.
Obsolescencia continua (continuous obsolescence): Destinar desproporcionados esfuerzos a adaptar un sistema a nuevos entornos.
Gestión champiñón (mushroom management): Tratar a los empleados sin miramientos, sin informarles de las decisiones que les afectan (manteniéndolos cubiertos y en la oscuridad, como los champiñones).

la verdad todos estan buenos asi que mejor sigan leyendo aquí.

He vuelto!

Después de un año sin escribir (notarán que el 2010 pasó de largo en este blog), decidí volver a intentar en este 2011, al menos con pequeñas entradas de noticias interesantes o producciones propias con pruebas y experiencias que realizo normalmente debido a mi profesión en el campo de las TIC’s.
Este blog seguirá el mismo enfoque de antes, algo escrito por y para mí que me ayuda a recordar problemas y soluciones, y que sirve como bitácora de lo sucedido durante el año. Pero además tiene como objetivo servir de ayuda a cualquier visitante y permitirme aprender y enriquecer el blog mediante sus comentarios.
Los temas a tratar son casi siempre los mismos, programación, testing, bases de datos, metodologías, etc... principalmente con tecnología .NET, pero uno nunca sabe y quizás vaya expandiendo el horizonte durante este año, esto dependerá de otros factores los cuales aún estoy reviendo.
Eso es todo por ahora, me voy a disfrutar mis últimos días de vacaciones.
Hasta pronto!