viernes, 15 de octubre de 2010

Guia Practica de Integration Services - Intermedia

Ejercicio 1 - Constraints
1.    Crear un nuevo paquete llamado Constraints
2.    Agregar un Execute SQL Task,    configurarlo y establecer la siguiente setencia :  SELECT 1 / CAST(2*RAND() AS INT) que nos regresara un valor aleatorio 1 o 0
3.    Agregar 1 Script Task Correcto y crear un Contraint
4.    Ejecutar el Paquete, ver cómo se comporta.
5.    Agregar 1 Script Task llamado Fallo que se ejecute cuando Falle el Paquete
6.    Copiar el Execute SQL Task, y conectarlo al Script Task Fallo,  que se ejecute cuando el Execute SQL Task Falle
7.    La ejecución del Script Fallo seria únicamente cuando ambos Fallen.
8.    Ejecutar el paquete
9.    Editar los Constraint para que la sea “OR” cualquiera de los dos que fallen se ejecutaría el Script Task Fallo.
10. Ejecutar el paquete
Ejercicio 2 – Variables ControlFlow
1.       Crear un nuevo Paquete llamado VariablesControlFlow
2.       Agregar un ForEach Loop Container
3.       Crear una nueva variable a nivel de Paquete de tipo string llamada Nombre_Archivo
4.       Asignar la Variable al ForEach Container, configurarlo en Collection como For Each File Enumerator y seleccionar el folder donde se encuentran los Archivos .CSV
5.       Agregar un Script Task
6.       Asignar la variabla al Script Task como “Read”
7.       Editar el script haciendo script en Edit Script. VB.NET: MessageBox.Show(Dts.Variables("Archivo_Nombre").Value.ToString) C#: MessageBox.Show(Dts.Variables["Archivo_Nombre"].Value.ToString);
8.       Ejecutar el Paquete
Ejercicio 3 –Trabajando con Configuraciones
1.       Menu SSIS seleccionar Package Configuration
2.       Crear uno nuevo y almacenarlo en un XML,  crear un nuevo Archivo de Configuracion llamado MyConfiguration
3.       Almacenar propiedades de Folder y  File Spec
4.       Visualizar Documento XML y verlo con formato de documento.
5.       Crear una variable de Entorno. SET SSISRutaConfig = “C:\archivo.dtsconfig”,  Ver Listado de Variables SET
6.       En las configuraciones Editar la configuración anterior y en lugar de asignarle al Archivo asignárselo a la variable de Entorno.
Ejercicio 4 – Containers
En SSIS existen 5 tipos de Containers:
-          Task Host Container :  En cualquier tarea se agrega un Container
-          Sequence Container
-          For Loop Container
-          ForEach Loop Container
-          Grouping Container
1.       Crear un nuevo paquete llamado ForEach
2.       Agregar un For Each Container
3.       Agregar dentro este un DataFlow Task
4.       Configurar el For Each Container à For Each File Enumerator,  Seleccionar el Folder de los Archivos de Texto y tipos de archivo .CSV
5.       Crear una Nueva Variable a nivel de Paquete llamada txtArchivo de tipo string.
6.       Crear una nueva fuente de datos FlatFileSource, crear su conexión a un archivo de la carpeta de Archivos de Texto.
7.       Vamos a asignarle la conexión dinámica a cada archivo dentro de la carpeta configurada en el For Each Contaniner,  seleccionamos la conexión, propiedades y hacemos click en Expressions.
8.       Seleccionamos la propiedad ConnectionString y el valor la variable txtArchivo.
9.       Agregamos MultiCast Transformations
10.   Agregamos un Dataviewers
11.   Ejecutamos el Paquete, vemos como está conectado al primer archivo,  y luego le damos “Detach” y vemos los datos del siguiente archivo.

Ejercicio 5 -   Operaciones de Archivo
1.       Crear un Nuevo Paquete llamado ManejoArchivos
2.       Agregar un For Each Loop Container
3.       Agregamos un Data Flow – Cargar Archivo dentro del For Each Loop
4.       Agregamos 2 File Sytem Task  - Renombrar Archivo , Mover Archivo , dentro del For Each  y creamos la relaciones de precedencia.
5.       Configuramos  el For Each para que busque los archivos de una Carpeta llamada InBox donde se encuentran 3 archivos .CSV.  ForEach File Enumerator.
6.       Creamos una variable a Nivel del paquete llamada RutaArchivo de tipo String.
7.       Asignamos la variable al For Each en variable Mapping.
8.       Ingresamos al DataFlow, agregamos un Flat File Source, Derived Column,  OLE DB Destination.
9.       Configuramos el Flat File Source,  lee desde los archivos en InBox
10.   Configuramos la Conexión creada al Archivo, en propiedades, expressions, y asignamos  ConnectionString la variable.
11.   Configuramos la Derived Column, nueva columna, llamada Tipo, con la siguiente expresión: UPPER( [Color])== "BLACK" ? "B":UPPER( [Color])== "RED"?"R":UPPER( [Color])== "SILVER"?"S":"U"
Donde   “==” à SI,  “?” à Entonces,  “:” à Sino
12.   Además agregamos la Fecha de Ejecución y el Nombre Usuario como columnas derivadas adicionales.
13.   Configurar el File System Task Renombrar Archivo, la operación es Rename.  Nos pedirá 2 conexiones Source y Destination.   Para Source seleccionamos la variable “RutaArchivo” y le decimos  que el Path será de tipo variable.  Para destination del File System Task Renombrar Archivo, tendremos que crear una nueva variable ya que nuestra conexión es dinámica.  Creamos una variable “RutaDestino”
14.   Tendremos que editar la variable para que obtenga valores de la otra variable y cree otro archivo. En Propiedades de la Variable “RutaDestino”,  le decimos que se evalue como expresión, EvaluateExpression= True y luego en Expressions, vamos a renombrar el valor de la Variable “RutaArchivo” para que tenga un sufijo de tal modo:  “Archivo_Loaded.CSV”.
SUBSTRING( @[User::Variable] , 1,  LEN( @[User::Variable] )-4) + "_Loaded" + ".csv"
15.   Configurar el File System Task Mover Archivo,  la Source seria la variable “RutaDestino”, y el destination seria una nueva conexión a un Folder Existente OutBox
16.   Ejecutar el paquete.
17.   Crear una configuración para el paquete que almacene los valores para la Conexión del Folder de Destino.

Ejercicio 6 – For Loop Container
1.       Crear u nuevo paquete llamado ProcesarArchivo
2.       Crear una nueva variable llamada ArchivoCheck de tipo Int32 a nivel del paquete
3.       Agregar un For Loop Container
4.       Editarlo y en propiedades  InitExpresion Inicializamos la variable a 0 :   @[User::ArchivoCheck] = 0
5.       En EvalExpression @[User:: ArchivoCheck] = 0
6.       Agregamos un Script Task, en Variables de Escritura asignamos la variable,  y hacemos click en Script
7.       Dentro del Editor verificamos si existe un Archivo de tipo Texto, utilizando el nombre de espacio system.IO.File.Exists,  si existe asigamos el valor a la variable a 1.
If (System.IO.File.Exists("c:\NewFile.txt")) then
            Dts.Variables("User::ArchivoCheck").Value = 1
   End If
8.       Agregamos otro Script Task y lo configuramos para q una vez que se complete el For Loop envie un mensaje “Archivo Recibido”.  Le Asignamos la variable ArchivoCheck como lectura
MsgBox("Archivo Recibido")
9.       Creamos un Constraint del Container a este Script
10.   Ejecutamos el paquete, este iterara hasta encontrar el archivo.
11.   Agruparlo, click derecho group.

Ejercicio 7 – Usando Transacciones
1.       Crear un Nuevo paquete llamado Transacciones
2.       Agregar 3 Execute SQL Task,  renombrarlos:  Crear Tabla Contabilidad,  Agregar Debitos,  Agregar Creditos
3.       Configurar la Crear Tabla Contabilidad,  una nueva conexión a nuestra base de ejemplos.  Input Directly y creamos nuestra tabla con los siguientes campos:  Cuenta varchar(10) , Monto money, Movimiento varchar(1)
4.       Configuramos Agregar Debitos,   y hacemos la sentencia T-SQL  para insertar  Cuenta:  A,  Monto: 100,  Movimiento : “D”
5.       Configuramos Agregar Debitos,   y hacemos la sentencia T-SQL  para insertar  Cuenta:  B,  Monto: 100G,  Movimiento : “C”
6.       Creamos precendencias para las tareas
7.       Ejecutamos el Paquete, provocamos un error en el crédito,  y vemos que se insertaron parcialmente la información.
8.       Borramos la Tabla
9.       Asignamos al paquete que soporte Transacciones:  TransactionOption=Required
10.   Seleccionamos la 3 Tareas y asignamos TransactionOption= Supported
11.   Para poder usar transacciones necesitamos el Coordinador de Transacciones Distribuidas.  En servicios de Windows lo verificamos.
12.   Corremos nuevamente el paquete y en OUPUT podemos ver el mensaje que nos envía del error y que se inicio el Coordinador de Transacciones Distribuidas.
13.   Agregamos 2 Containers y agregamos los 2 primeros Tareas al primero Container y la tercera al segundo Contenedor
14.   Quitamos la opción TransactionOption=Required del paquete y la asignamos Supported
15.   Asignamos a cada contenedor la propiedad TransactionOption=Required
16.   Ejecutamos el paquete y vemos que funcionan como transacciones independientes.

Ejercicio 8 – Explorando Datos
1.       Crear un paquete llamado DataProfiling
2.       Agregar en Control Flow Data Profiling Task
3.       Crear una nueva Conexión a la base AdventureWorksDW,  crear un análisis de datos Nulos para la tabla DimCustomers.  Se debe crear un nuevo archivo destino .XML
4.       Ejecutarlo y verificar el archivo XML, el cual tiene la estructura de los campos que analizo con la cantidad de datos nulos encontrados.
5.       Tambien se puede abrir el archivo con la aplicación Data Profile Viewer (Nuevo en SQL Server 2008)
6.       Agregamos nuevas Request al DataProfiling  Column Length Distribution,  Column Pattern Profile ,  Column Value Distribution, CandidateKey, Column Statistics. 
7.       Ejecutamos y analizamos una vez más el archivo con el Data Profile Viewer.  Seleccionar las Columnas para ver la Distribucion.  Hacer Doble Click sobre cualquier distribución para ver los registros.

Ejercicio 9 – Check Points
1.       Crear un nuevo Paquete llamado CheckPoints
2.       Agregar una Variable a nivel del paquete de tipo entero llamada “Estado”
3.       Agregar un Script Task.  Editarlo:  Asignar la variable de tipo escritura,  y en Script, incrementar el valor de la variable y regresar el valor.
Dts.Variables("Estado").Value = Dts.Variables("Estado").Value + 1
MsgBox(Dts.Variables("Estado").Value)
4.       Ejecutar el paquete
5.       Copiar y dejar 5 Script Task similares y renombrarlos  Script 1, 2, 3, 4, 5
6.       Agregar un Execute SQL Task, configurarlo para que falle SELECT 1/0.  División por 0
7.       Crear Constraint 1, 2,3, Execute SQL Task, 4, 5
8.       Ejecutar el paquete, ver el valor de la variable una vez que se reinicia.
9.       Aquí vamos a suponer que cada proceso de cada Script dura horas y que falla en uno de ellos,  tendríamos que reiniciar el proceso ??
10.   Configurar el paquete para que soporte checkpoint,  If Exists,  crear el archivo checkpoint con extensión .xml, y  SaveCheckPoints en True.
11.   Luego configurar el Execute SQL Task, para que si falle, falle el paquete,  FailPackageOnFailure = True
12.   Ejecutar el paquete y revisar el achivo xml de checkpoint creado,  verificar el valor de la Variable.
13.   Luego ejecutar nuevamente el paquete y ver donde inicia.
14.   Reparar la división por 0, y ejecutar el paquete ver donde reinicia.

Ejemplo 10 – Manejo de Errores
1.       Crear Tabla Productos, columna Codigo INT con valores permitidos entre 1 – 800
2.       Crear Tabla ProductosProblema Columna Codigo INT
3.       Crear nuevo paquete llamado  EventHandler
4.       Crear Variable llamada “RandVal”,   “Contador” de tipo Integer.
5.       Agregar un Execute SQL Task, para crear el Truncado de Tablas creadas anteriormente.
6.       Agregar For Loop Container y configurarlo:   InitExpression @Contador = 1, EvalExpression @Contador <=2000,  AssingExpression @Contador = @Contador + 1
7.       Agregar un Script Task en el For Lopp Container.  Asignar la variable de RandVal de tipo escritura.
8.       Editar el Script, 
  Dim rand As New Random
  Dim num As Integer = rand.Next(1001)
           Dts.Variables("Variable").Value = num
9.       Agregar un Execute SQL Task dentro del For Loop Container, conectarlo a la base donde creamos las tablas.  INSERT INTO Productos VALUES (@random).  Definir parámetros en Parameter Mapping, y buscamos la variables RandVal y le ponemos el nombre @random.
10.   Ejecutamos el paquete y vemos cuando falla. Verificamos las tablas
11.   En la pestana Event Handlers, buscamos el Execute SQL Task creado anteriormente dentro del For Loop y creamos un controlador de errores para “On Error”
12.   Agregamos un nuevo Execute SQL Task dentro del eventhandler.  Configuramos la inserción en la tabla ProducotsProblema  INSERT INTO ProductosProblema VALUES(@random),  creamos el parámetro.
13.   En las propiedades del For Loop Container buscamos la propiedad MaximumErrorCount y le ponemos una cantidad grande: 99999, hacer lo mismo para el Execute SQL Task dentro del contenedor.
14.   Ejecutamos el paquete y verificamos las tablas



Ejecutar Paquete DTS desde Programa (VB.NET)

Existe una forma sencilla de ejecutar un paquete DTS,  utilizar SQL Server.   De igual manera se haria usando la instruccion DTExec en un archivo .BAT.     Vamos a llamar a DTExec desde cmdShell pero en un procedimiento almacenado.

Lo primero seria habilitar el uso de cmdShell para SQL Server, el cual es por defecto deshabilitado.  Podemos hacerlo a traves de T-SQL de la siguiente manera:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE

EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE

Una vez configurado nuestro servidor podemos hacer el llamado a cualquier aplicacion tipo shell cmd desde T-SQL.

Crearemos nuestro procedimiento:

CREATE PROCEDURE sp_EjecutarPaquete(@Paquete varchar(500) )
As
   declare @Sql varchar(8000)
   Set @Sql = 'dtexec /Ser (local) /U sa /P 123 /SQ ' + @Paquete
   exec master.dbo.xp_cmdshell @Sql
  
Donde:  Ser es el servidor,  U usuario P password SQ el paquete.
Importante hacer notar que el paquete debera estar almacenado previamente dentro del servidor SQL.

Posteriormente solo tendremos que hacer el llamado al procedimiento almacenado para ejecutar el paquete, esto podria realizarse via programacion.

EXEC sp_EjecutarPaquete 'MiPaquete'

A traves de esta sentencia sencilla podriamos ejecutar un paquete desde nuestra aplicacion.

viernes, 8 de octubre de 2010

Guia Practica de Integration Services

Que es Integration Services?
Integration Services es parte de SQL Server,  es una herramienta para tareas de migración de datos, integración de datos,  o crear flujos de datos entre aplicaciones.
Es considerada una de las principales herramientas de ETL.
Que es ETL?
Extraer, Transformar y Cargar
Extraer
-          Traer datos de una fuente de datos
-          Se usan DataSources, Data Sources Views,  y Administrador de Conexiones

Transformar
-          Se manipulan datos y se mueven a un destino
-          Limpiarlos, formatearlos, transformarlos
-          Puede ser simple o complejo como sea necesario
Cargar
-          Insertar datos a un Destino,  archivos de Texo, Base datos, Hojas de Excel o bien a un Datawarehouse.

Cuando usarlo?
Principalmente para cargar un Datawarehouse.   Nos permite integrar datos,  extraer de 1 o mucha fuentes,  transformarlos y cargarlos a un destino.
Ejemplo: Realizar tareas con archivos.
   Obtener información y enviarlos por correo. 
  Mantenimiento de la Base datos

Paquetes de Integration Services
La unidad fundamental de ejecución.  Tiene un extensión de archivo DTSX.  Dentro del paquete esta la lógica de lo que quiero implementar.  Es un archivo XML que se ejecuta con la herramienta de SSIS e interpreta lo que se va a realizar.  Una solución consiste en uno o más paquetes
Típicamente consisten en muchos componentes.
-          Control Flows
o   Containers  -- Loop, o la operación de sequencia
o   Taks  -- Describe los pasos para habilitar pasos de la lógica
o   Precedence Constraints --  Establece el orden de la operación, quien precede a a quien  y las condiciones si las se completan la tarea o no

-          Data Flows
o   Es el Core de la funcionalidad de los datos
-          Connection Managers
o   Representa las fuentes de datos de origen o destino

Herramientas
-          Import and Export Wizard  (DTSWizard)
-          Business Intelligence Development Studio (BIDS)
-          SQL Server Management Studio
-          Notepad
-          DTEXEC desde CMD
-          SQL Server Agent

Ejercicio 1 – Nuestro Primer Paquete
1.       Abrir el DTSWizard desde el menú de Inicio o bien Ejecutar DTSWizard
2.       Conectarse a Northwind
3.       Luego Seleccionar Flat File Destination
4.       Hacer un Pre-View de los datos y de los tipos de datos.
5.       Guardar el paquete Fisicamente y Ejecutarlo Posteriormente
6.       Abrir el paquete y explorarlo.  Adicionalmente cambiar la ruta del Archivo.
7.       Abrir el paquete desde Notepad.
8.       Abrir el paquete desde BIDS
NOTA: Recordar que un paquete no es un EXE sino un documento que se carga siempre y cuando tengamos SSIS instalado.

Ejercicio 2  -  Conociendo BIDS
Diferencias entre Control Flow y DataFlow
ControlFlow : Permite crear la funcionalidad de Flujo de Datos,  en que orden, en que secuencia, preparación del ambiente de Trabajo
DataFlow : Trabaja con los datos en sí. 
1.       Crear un DataFlow y verificar la información de DataFlow
2.       Crear otro DataFlow y verificar la información.
Por tanto todo paquete tiene un ControlFlow y puede contener o no un Dataflow
Task Versus Components
Tareas dentro de ControlFlow
1.       Agregar un Sequence Container
2.       Organizar los DataFlow dentro del Sequence
3.       Agregar una Tarea de Email
4.       Conectar el Sequence con el Email con los Constraints
5.       Agregar componentes
a.       Sources  ---   OLE DB Source
b.      Transformations  -- Derived Column
c.       Destinations  -- Excel Destination
    Event Handler
1.       Crear un Evento OnError para el paquete
2.       Crear un Execute Task en el Evento OnError  y luego enviar un Email
Package Explorer
Navegar en el Paquete.
Creando Variables
Las variables se crean en dependencia de Scope (Ámbito).    Una variable a Nivel del Paquete puede ser accedida por los componentes existentes en el.
Crear una variable para el paquete y una para el DataFlow.

Ejercicio 3 -  Paquete Sencillo
1.       Crear un nuevo paquete llamado CargaDatos
2.       Desde el DataFlow crear un OLEDB Source
3.       Utilizar Derived Column y Unir 2 Columnas UPPER ([Col1] + “ ” + [Col2])   y agregarlo como nueva columna
4.       Crear un DataReaderDestination
5.       Agregar vistas para verificar la transferencia de los Datos.

Ejercicio 4 – Generando Archivos de Texto
1.       Crear Nuevo Proyecto llamado ManejoArchivos
2.       Desde Northwind cargar Products  y exportarlos a un archivo CSV
3.       Primero Agregar Un DataFlow
4.       Desde el DataFlow crear un OLEDB Source
5.       Dirigirla hacia un Flat File Destination
6.       Configurar origen y destino y ejecutar el paquete.
7.       Verficar Archivo
8.       Crear un FTP Task y configurarlo con el FTP proporcionado por el Instructor y enviar el Archivo Creado.

Ejercicio 5 – Usando Transformaciones
1.       Crear nuevo paquete llamado Transformaciones
2.       Crear 3 Conexiones para cada uno de los Archivos de Texto Proporcionados. Reds, Silvers, Blacks.
3.       Crear un Union Transformation
4.       Crear un Sort Transformation y Ordenar por Name, Color
5.       Agregar Audit Transformation y Unirlo a Sort.  Agregar Nombre Paquete, Tiempo de Ejecución,  Nombre de la Maquina, Usuario, Nombre de Tarea
6.       Finalmente agregar un Excel Destination y ubicarlo en la Carpeta de Ejemplos.  Todos.xls La Hoja llamada Todos.
7.       Ejecutarlo y verificar el Archivo.
8.       Agregar MultiCast Transformation
9.       Ordenar el Flujo de Sort a MultiCast y de aquí a Audit y a Excel
10.   Agregar un nuevo destino OleDB Destination y almacenar la información del Log.

Ejercicio 6 -  Importando Archivos de Texto
1.       Crear un nuevo Paquete ImportarArchivos
2.       Crear una Nueva Base de Datos llamada SSIS_Demos
3.       Ejecutar Script para crear Tabla Customers
4.       Crear un Nuevo DataFlow Task llamado Load Customers.  NOTA:  Se podría cargar la información con un Bulk Insert Task pero no nos ofrece la capacidad de Tranformar nuestros datos.
5.       Crear Nuevo Flat File Source,  crear la conexión al Archivo de Clientes.  Llamarla Archivo Customers
6.       Quitar algunas Columnas que no se deberán Cargar:  RowID, Passwords.
7.       Crear un OLBDDestination y crear una nueva conexión
8.       Asignarle Origen Destino
9.       Agregar a la Tabla Customers la columna Genero de Tipo nvarchar(1)  ---  FechaCarga DateTime  ---  Usuario nvarchar(50)
10.   Agregar un Componente Derived Column y Crear una Nueva columna derivada basado en Title y asignarlo a Genero. [Title] == "Mr." ? "M" : [Title] == "Ms." ? "F" : "U"
11.   Asignarle la Funcion GetDate() y la Variable del Sistema User a las otras 2 Columnas.
12.   Ejecutar Nuestro Paquete y ver la Pestana Progress y verificar los Warnings.
13.   Regresar a Control Flow y agregar Execute SQL Task configurarla para hacer TRUNCATE TABLE Customers.
14.   Agregar ForEachContainer
15.   Crear variable en el ámbito del proyecto para que sea accesible CustomerPath de Tipo String.
16.   Configurar ForEachContainer para que escriba en la variable
17.   Editar Constraint del ForEachContainer al DataFlow con 2 Condiciones que se ejecute correctamente y que también cumpla la condición @CustomerPath ¡= “”
18.   Realizar pruebas y modificar nombre para verificar que no se ejecute el DataFlow de No encontrarla.
19.   Agregar File System Task,  Renombrar el Archivo CustomerLoaded La Conexión de Origen (Source) deberá ser la misma que se utilizo para cargar el Archivo. Y la Destino seria Nueva Conexión Nuevo Archivo. Accion Rename File.
20.   Agregar File System Task,   Moverlo a un Folder OUT. Conexion de Origen la Anterior, Conexion Destino Nueva Conexion Folder Existente. Accion Move File
21.   Verificar que se realice correctamente.
22.   Agregar un Execute SQL Task.  Verificar que si esta vacio el ForEachContainer ejecute la SQL Task y esta importe los datos a una Tabla de Log. Hay que crearla antes, poner Fecha y Hora de Ejecucion y un mensaje de no carga.Reiniciar el  Proceso.