Buscar este blog

Mostrando las entradas con la etiqueta Base de Datos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Base de Datos. Mostrar todas las entradas

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.

26 enero 2009

Importar datos a SQL Server

Comparto una sencilla instrucción T-SQL para importar datos desde archivos CSV (Comma-Separated Values) a una tabla de SQL Server 2K5, CSV es ampliamente utilizado y muchos programas exportan a este formato como por ejempolo Excel aunque el separador puede diferir de una coma y ser cualquier caracter. Con BULK INSERT se puede utilizar un archivo XML que describa el esquema y los tipos de datos a importar. Para mas detalles ver esto.
En este ejemplo utilizo el codigo de página de caracteres 850 "Multilingual (Latin-1)" (Western European languages) que mapea en su conjunto de caracteres a las letras acentuadas y la 'ñ' necesarios en nuestro idioma y es el set que utilizan la mayoría de los sistemas legacy bajo DOS desde donde solemos importar los datos. También podemos ver que le indico que el delimitador de campo es el ';' y que los registros terminan con nueva línea '\n'.
USE <DB>
BULK INSERT <Tabla>
FROM '<Archivo>.csv'
WITH
(
CODEPAGE = '850',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
KEEPNULLS
)
GO
Nota: En la instrucción anterior <Tabla> debe tener la misma cantidad de campos y con un tipo de datos compatible al origen de datos, además esta puede ser una tabla temporal intermedia para un proceso de importación más elaborado.
Espero que les sirva, saludos!

17 diciembre 2008

Pequeña utilidad para DBFs

Me encuentro intentando migrar datos de unos viejos DBFs a SQL Server para trabajar mas cómodo, para luego desde allí transformar los datos y pasarlos a las tablas destino, si bien esto se puede hacer con el administrador de SQL Server 2000 mediante DTS y creo que también con el SQL Server 2005 Integration Services (SSIS) para versiones Server, yo estoy trabajando con la versión 2005 Express y no cuento con estas herramientas, asi que decidí hacer una pequeña utilidad de migración: DBFExtractor.

Instrucciones de uso:

1-Seleccionar el DBF origen de los datos.
2-Editar string de conexión a la base de datos destino.
3-Presionar botón Crear y Copiar Tabla

Screenshots: (Wow qué GUI!)


Tabla creada en sql server...


Datos importados desde el DBF...



Pueden bajar el ejecutable y/o el código fuente.

Si prefieren SVN:
svn checkout http://dbfextractor.googlecode.com/svn/trunk/ dbfextractor-read-only

Enlaces relacionados: Google Code, DBF Explorer

24 septiembre 2008

Cambiar un tipo de datos en todas las columnas

Interesante script que armé en T-SQL para cambiar tipos de datos de todas las columnas de todas las tablas existentes en una base de datos. En mi caso necesitaba cambiar todas las columnas decimal(9,3) y decimal(10,3) a columnas decimal(10,4) para soportar números de 10 dígitos enteros y 4 decimales ya que si queremos guardar 4 decimales en un decimal(n,3) el número es redondeado por SQL Server a 3 decimales. Otra situación común para la que puede usarse es para cuando subestimamos o sobreestimamos los campos del tipo "descripción" en nuestras bases de datos, por ejemplo, nos damos cuenta que exageramos con campos varchar(500) y queremos cambiarlos a todos a varchar(200). Espero que les sirva.
-- VARIABLES  
DECLARE @tblName0 NVARCHAR(150)
DECLARE @tblName NVARCHAR(150)
DECLARE @colName NVARCHAR(150)
DECLARE @colDataType NVARCHAR(50)
DECLARE @colNumericPrecision numeric
DECLARE @colNumericScale numeric
DECLARE @cont numeric
-- CURSOR
DECLARE cur_tables CURSOR FOR
select t.table_name, column_name, data_type,
numeric_precision, numeric_scale
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'
and (numeric_precision=9 or numeric_precision=10)
and numeric_scale=3
OPEN cur_tables
FETCH NEXT FROM cur_tables INTO @tblName, @colName, @colDataType,
@colNumericPrecision, @colNumericScale
SET @tblName0=''
SET @cont=0
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('alter table ' + @tblName +
' alter column ' + @colName + ' decimal(10,4)')
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(10,4)'

FETCH NEXT FROM cur_tables INTO @tblName, @colName , @colDataType,
@colNumericPrecision, @colNumericScale
END
PRINT '----------------------------------------------------------'
PRINT cast(@cont as nvarchar(10)) + ' columnas afectadas.'
CLOSE cur_tables
DEALLOCATE cur_tables

05 septiembre 2008

Conectando NetBeans con SQL Server 2005


Primer dilema, ¿que versión de driver instalo?

Microsoft SQL Server 2005 JDBC Driver 1.2
Dado que las funciones de JDBC 3.0 requieren la versión 1.4 o posterior de Java Runtime Environment (JRE), el controlador JDBC también requiere la versión 1.4 o posterior de JRE. El controlador JDBC se ha diseñado para funcionar en prácticamente todos los equipos virtuales principales, aunque es oficialmente compatible con Sun JRE 1.4 o posterior.

Microsoft SQL Server 2005 JDBC Driver 2.0
A partir de la versión 2.0, el driver JDBC viene con soporte para Java Database Connectivity (JDBC) Spec API y ha sido extendido para incluir las especificaciones JDBC 4.0. La JDBC 4.0 fue incorporado como parte de la Sun Java SE Development Kit (JDK) 6.0 y la Java Runtime Environment (JRE) 6.0. JDBC 4.0 es una generalizacion
de de JDBC 3.0. Este driver soporta ambas especificaciones JDBC 3.0 y JDBC 4.0.

Manos a la obra:
Como yo uso la JRE 6.0 y JDBC 4.0 voy a conectarme utilizando la versión 2.0 del conector JDBC para SQL Server 2005 el cual lo podemos bajar de aquí. El IDE a utilizar es NetBeans 6.5 beta y el DBMS es SQL Server 2005 Express Edition.

Paso 1) Bajar, ejecutar y descomprimir los archivos, en mi caso moví luego la carpeta a C:\Archivos de programa\

Paso 2) Abrimos NetBeans, como comente antes en mi caso la versión 6.5 beta aunque el procedimiento debería ser similar para versiones 6.x. Nos vamos a la pestaña de "Services" y luego al nodo "Drivers" y hacemos click derecho sobre este, para luego hacer click en "New Driver...".



Paso 3) Hacemos click en "Add..." y le damos la ruta del driver en mi caso: C:\Archivos de programa\Microsoft SQL Server 2005 JDBC Driver\sqljdbc_2.0\enu\sqljdbc4.jar y luego presionamos en "OK".



Veremos que se nos agrega un nodo en "Drivers" que se llama: "Microsoft SQL Server 2005".


Paso 4) Click derecho sobre el nodo de nuestro nuevo driver y seleccionamos "Connect Using...".


Completamos los datos de la conexión en cada campo o simplemente escribimos el string de conexión completo en el campo JDBC URL haciendo primero click en "Show JDBC URL". En este caso el string de conexión es: "jdbc:sqlserver://LAPTOP\SQLEXPRESS;databaseName=prueba;" a esto le faltaría agregar
la parte de autenticación con lo que quedaría: "jdbc:sqlserver://LAPTOP\SQLEXPRESS;databaseName=prueba;user=usuario1;password=123"
Lo que no me anduvo fue utilizar seguridad integrada con el parámetro "integratedSecurity=true". Pruebenlo y si logran hacerlo andar me dicen como por favor...


Pasamos a la pestaña "Advanced", presionamos en "Get Schemas" y seleccionamos "dbo", sino hacemos esto no podremos ver los campos de las tablas en el IDE.


Paso 5) Si todo sale bien y no se escucha ningún chan!, los felicito acaban de configurar una conexión a SQL Server 2005 Express desde NetBeans!
Podemos ahora ver en la seccion de conexiones nuestra conexión recién creada.


Paso 6) Para comprobar de que todo anda bien (por lo menos un SELECT *) expandimos las tablas en el nodo "Tables" y hacemos click derecho sobre alguna tabla y elegimos "View Data..." y ... voilà!



Si tropezaron en el paso 5 y están utilizando un servidor remoto o virtual puede ser que haya faltado configurarle las conexiones remotas a SQL Server, esto se puede habilitar con la herramienta "Configuración de superficie de SQL Server", tampoco olvidar ejecutar el servicio "Explorador de SQL Server".




Espero que este humilde tutorial sirva para algo y para alguien. Saludos!

Enlaces relacionados: MSDN, NetBeans, JDBC

04 febrero 2008

Salió el "Sol" para "My"


Ya había leído por ahí algunos anuncios, pero ahora me llego desde la lista oficial de noticias de MySQL AB y quería compartirlo:

“…Con millones de despliegues globales incluyendo Facebook, Google, Nokia, Baidu
y China Mobile, MySQL brindará sinergia a Sun y eso cambiará el panorama de la industria del software, derivando en la nueva adopción de la base de datos de fuente abierta MySQL en aplicaciones más tradicionales y empresariales…”

Leer mas (inglés): aquí…

29 noviembre 2006

TORNEO DE SQL

Ser realizó un torneo de consultas SQL muy interesante, en nuestra facultad. El evento fué organizado por el Grupo de Usuarios DB2 de la U.T.N. F.R.Re.
El torneo fué el Sábado 25/11, y no me había decidido a participar hasta el Viernes, hasta que me inscribí , participé y hasta me lleve un regalito... Ver más