INTEGRATION SERVICES
Sequence Container
Creamos una tabla
create table Demo (
ID int identity,
Categoria varchar(15),
Monto float
)
Insertamos 6 registros
insert into Demo (Categoria, Monto) values ('BBB', 743.13), ('YYY', 4754.32), ('LLL',
865.23), ('QQQ', 74.32), ('DDD', 3.23), ('SSS', 34.32)
Creamos una tabla para renombrar a la tabla Demo
create table DemoDest (
ID int identity,
Categoria varchar(15),
Monto float
)
Creamos un Contenedor de Secuencias
En eliminar tabla -> SQLStatement (drop table Demo)
En renombrar tabla -> SQLStatement (sp_rename ‘DemoDest’, ‘Demo’)
Si ejecutamos el ETL el transactionOption cambiamos a Requerid para que si algo falla no se ejecute todo el
proceso (ROLLBACK)
Si cambiamos a NoSupported entonces se ejecutara hasta donde no falle el proceso (COMMIT)
Validamos y notamos que se eliminan los registros de la tabla Demo
Foreach loop
Alter table FIFA add PieEsp varchar(10)
select ID, PiePreferido from FIFA
select top 100 ID from FIFA where PieEsp is null
update FIFA
set PieEsp = case when PiePreferido = 'Left' then 'Izquierdo'
else 'Derecho'
end
where ID = ?
select * from FIFA
alter table FIFA add RangoAltura varchar(20)
select * from FIFA
Creamos 2 variables
Datos de tipo Object
ID de tipo int
Creamos una tarea SQL cambiamos el ResultSet
el resultado se guarda en una variable
En el contenedor foreach Loop
Se mapea la columna ID con el índice dentro del foreach se pone 0 para que lo recorra completo
Creamos otra tarea SQL dentro del contenedor Foreach Loop (ResultSet ninguno)
Validamos que cambian los 100 primeros
For Loop
Creamos la tabla contadores
create table contadores (Contador int not null, Hora Time)
creamos variable
Contador tipo int
Metemos una Tarea SQL en el contenedor
En el Contenedor For Loop
Validamos
Send Mail Task
Para enviar un correo
Insertamos una Tarea Script
Dar en editar script
Agregamos 2 librerias:
using System.Net;
using System.Net.Mail;
y el codigo para enviar correo
FIN CARGA PRIMERO PROYECTO", "carga finalizada");
SmtpClient smtcli = new SmtpClient("smtp.live.com", 25); smtcli.EnableSsl = true;
smtcli.DeliveryMethod = SmtpDeliveryMethod.Network;
smtcli.Credentials = new NetworkCredential("
[email protected]", "528808832103");
smtcli.Send(msg);
Dts.TaskResult = (int)ScriptResults.Success;
DATA FLOWS
Aggregate
Este componente puede ser de mucha utilidad cuando queramos transformar datos a escalas
menores, de forma agregada (sumarizados, promediados, etc.)
delete Promedios;
delete JugadoresPorNacionalidad;
Creamos un dataFlow
- Origen de datos
Invocar tabla FIFA
create table Promedios (PiePref varchar(10), PromedioPesoKg float)
create table JugadoresPorNacionalidad (Nacionalidad varchar(100), CantidadJugadores int)
- Aggregate
Se va agregar dos conjuntos de datos marcamos advance para agregar
las salidas al control.
Vamos a calcular el peso promedio por pie preferido (en peso vamos a
marcar average)
En JugadoresPorPaises ID -> count
Agregamos 2 destinos OLEDB
1. TABLA Promedios
2. TABLA JugadoresPorNacionalidad
Validamos ETL
Conditional Split
El Conditional Split es un componente que nos va a permitir evaluar expresiones para cada
columna de un set de datos. El componente evalúa expresiones y basado en el resultado de
estas dirige los datos a una salida en específico.
Creamos las tablas
select top 0 ID, NombreCompleto, FechaNacimiento
into MayoresAa1990
from FIFA
select top 0 ID, NombreCompleto, FechaNacimiento
into MenoresAa1990
from FIFA
En el origen de Datos insertar la sentencia
select ID, NombreCompleto, FechaNacimiento from FIFA
Creamos un conditional Split
Creamos un destino OLEDB
1 Para insertar los datos a la tabla MayoresAa1990
2 Para insertar los datos a la tabla MenoresAa1990
Validamos
select min(datepart(year, FechaNacimiento)) as Minima
from MayoresAa1990
select max(datepart(year, FechaNacimiento)) as Maxima
from MenoresAa1990
Derived Column
Tres componentes para trabajar sobre columnas de forma específicas ya sea copiándolas,
creándolas, sustituyéndolas o cambiando su tipo de datos.
Creamos la tabla
create table EdadJugadores (
ID int,
NombreCompleto varchar(150),
Edad int
)
Creamos el origen de datos
select ID, NombreCompleto, FechaNacimiento from FIFA
Creamos la columna derivada (para calcular la edad de un jugador de acuerdo a su año de
nacimiento)
Creamos el destino OLEDB con la tabla EdadJugadores
Validamos
Lookup transformation
Lookup nos ayuda a realizar búsquedas de filas de un set de datos dentro de otro
se borra 1000 registros de la tabla EdadJugadores
delete top (1000) from EdadJugadores
creamos un origen de datos
select ID, NombreCompleto, FechaNacimiento from FIFA
insertamos el Lookup
Marcamos No cache por que no vamos a trabajar con un archivo [al lookup le decimos que busque
dentro de la tabla EdadJugadores cada uno de los registros que vienen desde la tabla FIFA
(origen de datos) a través de la columna ID que es con la que estoy haciendo el JOIN]
Los que no hacen match redirigirlo a un output
Realizamos la conexión e insertamos la tabla de destino
Marcamos la ID por que es la columna por la cual vamos a hacer la comparación.
Cuando conectemos con la columna derivada escoger la opción que no hace match
En columna derivada (CALCULA EDAD)
E insertamos el destino INSERTAR EDAD
Ponemos la tabla EdadJugadores como destino
EJEMPLO 2: El cache transform no se puede utilizar dentro de un dataflow que ya este
utilizando Lookup, se necesita un dataflow que cargue los datos a cache y un segundo a
dataflow que va realizar la búsqueda y la inserción final de la data
En el primer dataflow (CARGAR DATOS)
Creamos origen
select ID, NombreCompleto, Edad from EdadJugadores
insertamos un cache transform
En columnas asignamos al ID la posición de índice el valor 1, ya que es por ella por la que
vamos a realizar la busqueda
En el segundo dataflow (BUSCAR)
Crear Origen de datos
select ID, NombreCompleto, Edad from EdadJugadores
en el Lookup
FLUJO
Merge, Union all y sort
Tres componentes que nos permiten agrupar distintos sets de datos, cada uno tiene sus
particularidades y dependencias.
Creamos la tabla FifaMerged
select top 0 * into FIFAMerged from MenoresAa1990
Creamos el origen de datos 1 (Mayores 1990)
Insertamos la tabla MayoresAa1990
Creamos el origen de datos 2 (Menores 1990)
Insertamos la tabla MenoresAa1990
Antes de crear un Merge debo ordenar los datos con el componente Sort
En el primer sort
En el segundo sort
Unimos los sort en el componente Merge
Luego creamos el destino OLEDB la tabla FifaMerged
Validamos que se mezclan las 2 tablas mayores y menores en la tabla FifaMerged
Si queremos unir mas tablas utilizamos el UNION ALL
Merge Join
Este componente nos permite generar un set de datos final luego de regalizar relaciones o
joins entre dos o más datasets tal como lo hacemos con código T-SQL
Primero
select top 0 * into EdadNacimientoJugadores
from EdadJugadores
alter table EdadNacimientoJugadores add FechaNacimiento date
select * from EdadNacimientoJugadores
Creamos el origen EDADJUGADORES
Con la table EdadJugadores
Creamos el origen FIFA
Con la tabla FIFA
En el primero sort
En el segundo sort solo marcamos FechaNacimiento y el ID
Creamo el Merge Join y unimos los sorts
Insertamos un destino OLEDB
A la tabla EdadNacimientoJugadores
Validamos
Multicast
El multicast distruye un data set de entrada en uno o más datasets de salidas. Su
comportamiento es similar al del Conditional Split. Ambas transformacinoes reciben una
entrada de datos y las distribuyen en varias. La diferencia básicamente es que el conditional
Split envía una fila una única salida mientras que el multicast envía todas las filas
existentes a cada una de las salidas definidas.
Creamos la tabla
create table NombresUno (
Nombre varchar(150)
)
Creamos el origen de datos
select Nombre from FIFA
creamos un destino OLEDB
a la tabla NombresUno
Creamos un componente de archive plano
Validamos tabla y archivo plano
Ole db command
El Ole db command nos brinda la facilidad de ejecutar una instrucción SQL para cada una de
las filas del data flow.
--ALTURA MAYOR O IGUAL A 160 = ALTO
--ALTURA ENTRE 161 Y 169 = MEDIO
--ALTURA MENOR O IGUAL A 160 = BAJO
Insertamos un origen de datos
select ID, AlturaCM
from FIFA
where RangoAltura is null
En columna derivada
En OLEDB Command
RangoAltura com parámetro 0 porque es el primer parámetro en la consulta update FIFA set
RangoAltura = ? where ID = ?
Validamos
Rowcount
Con este componente podemos contar los registros o filas que pasan a través de un data flow.
Agregaremos al ETL del capítulo OLE DB Command, un paso adicional para almacenar un log de
ejcución de nuestro ETL, donde utilizaremos además algunas variables del sistema.
Creamos una tabla
create table LogEjecucion (
PaqueteID uniqueidentifier,
PaqueteNombre varchar(100),
FechaHora smalldatetime default getdate(),
PC varchar(100),
CantidadRegistros int
)
Creamos una variable
Contador1
Creamos un countrow y escogemos la variable contador1 para contar la cantidad de filas que
van a pasar por el dataflow
Creamos una tarea SQL
validamos
Row y Percentage Sampling
Muchas veces necesitamos trabajar solo con una parte de los datos; ya sea para manipular menos
datos desde un ambiente de desarrollo o porque estamos realizando un ejercicio estadístico, Row y
Percentage Sampling nos permiten elegir de manera aleatoria datos de un dataset, ya sea de forma
absoluta especificando la cantidad de filas a requerir o de manera relativa eligiendo una muestra basada
en un porcentaje
Creamos las tablas
create table AleatoriosAbsolutos (ID int, nombre varchar(150))
create table AleatoriosAbsolutosNoElegidos (ID int, nombre varchar(150))
create table AleatoriosRelativos (ID int, nombre varchar(150))
create table AleatoriosRelativosNoElegidos (ID int, nombre varchar(150))
Creamos dos orígenes OLEDB (ABSOLUTO, RELATIVO)
select ID, Nombre from FIFA
Creamos el row sampling
Creamos el percentage sampling
Creamos 4 destinos
Tabla AleatoriosAbsolutos
Tabla AleatoriosAbsolutosNoElegidos
Tabla AleatoriosRelativos
Tabla AleatoriosRelativosNoElegidos
Validamos
Slowly changing dimension - Dimensiones
Lentamente Cambiantes
Uno de los componentes más cautivadores, SCD por sus siglas en inglés, Slowly Changing Dimensions,
se refiere a los datos de las dimensiones que van cambiando a través del tiempo. Las dimensiones
pueden ser estáticas como los años y meses, o cambiar lentamente como los nombres de los países, o
cambiar más rápidamente como la clasificación de los productos.
Creamos un esquema DW y la tabla DW.FIFA
create schema DW
create table DW.FIFA(
ID int identity,
IDKey int,
Nombre varchar(255),
FechaInicio date default getdate(),
FechaFin date
)
En el origen de datos
select *
from FIFA
where ID<5000
Creamos un Slowly changing dimension
Validamos
--Club original JUVENTUS
update FIFA
set Club = 'PSG'
where ID=1179