miércoles, 3 de octubre de 2018

Specify Computed Columns in a Table (Columnas Calculadas) - SQL SERVER

Algunas veces se hace necesario realizar cálculos complejos sobre la información que se encuentra almacenada en una tabla de una base de datos, que si se realiza desde el aplicativo puede que tarde algún tiempo, por lo tanto, se puede asignar este trabajo pesado al motor de la base de datos.

A continuación, se muestra como se realiza desde el motor.

Iniciamos con la creación de la tabla de la base de datos:


CREATE TABLE dbo.EmpleadosFact
(
    EmpleadoId int IDENTITY (1,1) NOT NULL
  , SalarioBasico money
  , HorasExtras int
  , Bonificacion money
  , Salario_total AS SalarioBasico +  (SalarioBasico/240)* HorasExtras + Bonificacion
  , impuestos_salud as (SalarioBasico +  (SalarioBasico/240)* HorasExtras + Bonificacion) * 0.04
  , impuestos_pension as (SalarioBasico +  (SalarioBasico/240)* HorasExtras + Bonificacion) * 0.05
);   


Ahora vamos a realizar la inserción de un registro para evaluar la formulas predefinidas.

INSERT INTO [dbo].[EmpleadosFact]
 ([SalarioBasico],[HorasExtras],[Bonificacion])
     VALUES (6000000,10,430000.50);

Y el resultado es el siguiente:




También cuando se realiza la actualización sobre uno de los registros, se realizará el cálculo nuevamente, así:



UPDATE [dbo].[EmpleadosFact]  SET [SalarioBasico] = 6200000
 WHERE EmpleadoId = 1;

  
 

Para mayor información: 


Y así terminamos, en la base de datos de Postgresql se realiza mediante un trigger no existe las columnas calculadas en este motor.


Gracias hasta la próxima vez. 









jueves, 26 de julio de 2018

Consultar el tamaño y el numero de registros en SQL SERVER , Postgresql y Mysql

Buenos dias, nuevamente estoy en la actualizacion del este blog hoy voy a tratar un tema de invetario de objetos  tanto en el tamaño que ocupan, como en el numero de registro en las diferenetes bases de datos.

Esto ayuda mucho cuando se realiza procesos de migracion o ETLs.

Por ejemplo con el siguiente script se puede calcular el numero de registros de las tablas de una base de datos en SQL SERVER:



select sysobjects.name
, sum(case when sysindexes.indid<2 then rows
else 0 end) as rows
, sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid=255 then sysindexes.used
else 0 end) * 8 as Data
, (sum(case when sysindexes.indid in (0,1,255) then sysindexes.used
else 0 end)
- sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid=255 then sysindexes.used
else 0 end))*8 as index_size
, (sum(case when sysindexes.indid in (0,1,255) then
sysindexes.reserved-sysindexes.used
else 0 end)*8) as unused,xtype
from sysobjects
join sysindexes
on sysobjects.id=sysindexes.id
where xtype='U'
group by sysobjects.name,xtype
order by 2 desc


En Postgresql se haría asi:

SELECT
nspname AS schemaname,relname,reltuples::integer,pg_size_pretty((relpages*8)::bigint*1024) AS "Tamaño Objeto"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND relkind='r'
ORDER BY reltuples DESC;


En MySql es asi:


SELECT `table_schema` AS `Schema`, `table_name` AS `Table`, `engine` AS `Engine`, `table_rows` AS `Rows`, ROUND(((data_length + index_length) / 1024 / 1024), 3) `Size` 
FROM information_schema.TABLES WHERE table_schema NOT IN ('information_schema', 'mysql') ORDER BY (`Size`) DESC;



miércoles, 25 de julio de 2018

Herramienta Util para exportar informacion de una base de datos Postgresql

Este proyecto realiza una consulta a la base de datos en Postgresql que se coloca en el text y trae la informacion a una grilla, tambien hay un boton para exportar la informacion que se muestra en la grilla a Excel.






Una herramienta muy util porque exporta la información sin ninguna modificación.

Para este codigo se utilizaron las siguientes librerias:
java.io.FileOutputStream
java.sql.Connection
java.sql.Date
java.sql.DriverManager
java.sql.ResultSet
java.sql.ResultSetMetaData
java.sql.Statement
java.util.Properties
javax.swing.table.DefaultTableModel
javax.swing.table.TableModel
org.apache.poi.ss.usermodel.CellStyle
org.apache.poi.ss.usermodel.Font
org.apache.poi.xssf.usermodel.XSSFCell
org.apache.poi.xssf.usermodel.XSSFCellStyle
org.apache.poi.xssf.usermodel.XSSFRow
org.apache.poi.xssf.usermodel.XSSFSheet
org.apache.poi.xssf.usermodel.XSSFWorkbook


El código sera podra descargar del siguiente link: https://github.com/olimpop/TablasScripts

Lectura de Archivos de Texto desde la C#

Para realizar la lectura de archivos texto hacemos uso de el Metodo System.IO.StreamReader (system.io.streamreader)

Esta permite hacer  una lectura de una línea de caracteres de la secuencia actual y devuelve los datos como una cadena.

 


El codigo completo se encuentra disponible en el siguiente link:
https://github.com/olimpop/lecturatxt


miércoles, 18 de abril de 2012

Como duplicar una tabla en Sql Server

COMO DUPLICAR UNA TABLA EN SQL SERVER 


Para duplicar una tabla, se pueden realizar dos tareas:

1. Copiar sólo la estructura así:

SELECT * Into NombreTablaDestino 
From NombreTablaOrigen Where 1 = 2

2. Copiar toda la tabla ( estructura, datos) así:

SELECT * Into NombreTablaDestino 
From NombreTablaOrigen Where 1 = 1

PARA TENER EN CUENTA
VERIFICAR QUE NO EXISTA UNA TABLA DESTINO CON EL MISMO NOMBRE

jueves, 29 de marzo de 2012

Tablas Temporales en SQL Server

Tablas Temporales en Sql Server (#table y @table)

Las tablas # son tablas temporales locales que son visibles solo en tu session estas tablas se almacenan en la DB tempdb.
Sintaxis para crear una tabla #.
Create table #paso( id int, nombre varchar(20), apellido varchar(40))
Buscar la tabla dentro de los objetos de la db.
Select name
from tempdb.sysobjects
where name like ‘%#paso%’
Para eliminar la tabla.
drop table #paso
Las tablas @ son mucho mas flexibles y no es necesario eliminarlas ya que al momento de terminar su ejecución se eliminan automaticamente.
Sintaxis para crear una tabla @.
declare  @paso table ( id int, nombre varchar(20), apellido varchar(40))
Cuando usar tablas # y tablas @:
  • Si usted tiene menos de 100 filas puede utilizar una tabla @, De lo contrario usar una tabla temporal. Esto es porque SQL Server no va a crear las estadísticas sobre la tabla @.
  • Si necesita crear índices entonces debe utilizar una tabla temporal #.

Adicional  escribo un ejemplo de la utilizacion de este codigo:


DECLARE @Temp TABLE(ID INT)
DECLARE @Int INT,
        @InnerInt INT
SELECT  @Int = 1,
        @InnerInt = 1

WHILE @Int < 2
BEGIN
    WHILE @InnerInt < 10
    BEGIN
        INSERT INTO @Temp SELECT @InnerInt
        SET @InnerInt = @InnerInt + 1
    END
    SELECT @Int = @Int + 1,
            @InnerInt = 1
        select * from @Temp
    DELETE FROM @Temp
END

GO

DECLARE #Temp TABLE(ID INT)
DECLARE @Int INT,
        @InnerInt INT
SELECT  @Int = 1,
        @InnerInt = 1

WHILE @Int < 2
BEGIN
    WHILE @InnerInt < 10
    BEGIN
        INSERT INTO #Temp SELECT @InnerInt
        SET @InnerInt = @InnerInt + 1
    END
    SELECT @Int = @Int + 1,
            @InnerInt = 1
        select * from #Temp
    TRUNCATE TABLE #Temp
END

lunes, 24 de mayo de 2010

Sobre C# un principiante pero con muchas ganas

Desde hace unos meses vengo trabajando en Visual Studio 2008/2012/2015, sobre plataforma C# (C Sharp), venia trabanjo con Visual 6 pero me di cuenta que es muy atrasado y existe herramientas en la actualidad que son mas rapidas y mejor estructuradas.

El primer ejemplo que realice fue el tipico "Hello Word", pero con una variante podemos utilizar la linea de comando de la consola solo para hacer esta prueba.

Console.WriteLine("Hello Word") ;