En la primera entrega de esta serie, preparábamos la base de datos en la cual, con la ayuda de un paquete SSIS, vamos a realizar el volcado y depuración de datos desde las diversas fuentes de origen. Esta segunda parte y la siguiente, estarán dedicadas íntegramente a la carga y optimización de la tabla de clientes, que posteriormente emplearemos en el modelo tabular, para analizar las ventas por este segmento del sistema de información.

Continuando con el proyecto SSIS de Visual Studio, que iniciábamos en la primera parte, el siguiente paso del diseñador del paquete, consistirá en realizar una extracción de datos desde la tabla DimCustomer (base de datos AdventureWorks2016), volcándolos seguidamente en la tabla Cliente (base de datos VentasAnuales). Más concretamente, las columnas a extraer desde la tabla origen serán CustomerKey, FirstName, LastName, MaritalStatus y Gender. Para ello, vamos a emplear una tarea de tipo Flujo de datos (Data Flow Task), que añadiremos al diseñador del paquete, y renombraremos como flw_Cliente.

 

Un flujo de datos, tal y como su nombre indica, tiene la misión de controlar el movimiento que se produce en un conjunto de datos entre un origen y un destino, a través de varios componentes específicos que encontramos en la caja de herramientas de SSIS. En el caso que nos ocupa actualmente, haremos doble clic en el flujo, para entrar en su propio panel de diseño, donde añadiremos un Origen de OLE DB (OLE DB Source), al que daremos el nombre src_DimCustomer, y que representa una tarea de transformación proveedora de datos.

 

Vamos a configurar el origen src_DimCustomer haciendo doble clic sobre el mismo, o bien clic derecho, seleccionando la opción Edit, lo que abrirá la ventana OLE DB Source Editor. En el panel izquierdo de este editor, nos situaremos en el apartado de propiedades Connection Manager. Desplegando la propiedad OLE DB connection manager, seleccionaremos la conexión cnAdventureWorksDW2016. En la propiedad Data access mode seleccionaremos Table or view; y desplegando la lista Name of the table or the view elegiremos la tabla DimCustomer.

 

A continuación, en el apartado Columns, marcaremos, dentro del recuadro Available External Columns, aquellas columnas que van a quedar accesibles desde este Origen de OLE DB, y que en este ejemplo serán las siguientes: CustomerKey, FirstName, LastName, MaritalStatus y Gender.

 

Haciendo clic en OK finalizaremos la creación del origen de datos, al que daremos el nombre src_DimCustomer.

Seguidamente, añadiremos al diseñador un Destino de OLE DB (OLE DB Destination) con el nombre dest_Cliente, que representa una fuente de datos sobre la que volcaremos los datos del origen recién creado.

 

Para reconducir los datos que se originan en src_DimCustomer y hacerlos llegar a dest_Cliente, arrastraremos la flecha perteneciente al Data Flow Path, que parte desde el origen de datos, hasta conectarla con el destino que acabamos de añadir al diseñador.

 

De lo anterior podemos deducir que un Data Flow Path nos permite establecer la dirección que, dentro de una tarea de Flujo de datos, tomarán dichos datos entre las diferentes tareas de transformación del flujo.

En el siguiente paso editaremos el Destino de OLE DB asignando, en el apartado Connection Manager, la propiedad OLE DB connection manager a la conexión cnVentasAnuales. En la propiedad Data access mode elegiremos Table or view – fast load, y en Name of the table or the view la tabla Cliente.

 

Continuaremos en el apartado Mappings, donde conectaremos las columnas de la tabla origen DimCustomer con las de la tabla destino Cliente.

 

Tras guardar los cambios en la ventana OLE DB Destination Editor, volveremos al diseñador del Flujo de datos, donde observaremos que el Destino de OLE DB muestra un símbolo de error con el mensaje Columns “FirstName” and “Nombre” cannot convert between unicode and non-unicode string data types.

 

El motivo de este error radica en que SSIS no realiza una conversión automática de tipos (type casting), entre las columnas con tipo de dato nvarchar del origen src_DimCustomer, y las columnas del destino dest_Cliente, de tipo varchar, con las que están conectadas.

Observemos detenidamente los tipos de datos que corresponden a las columnas implicadas en el problema. Haciendo clic derecho en el origen src_DimCustomer, seleccionaremos la opción Show Advanced Editor (también disponible desde la ventana de propiedades del Origen de OLE DB).

 

Entraremos en la ventana Advanced Editor for src_DimCustomer, en cuya pestaña Input and Output Properties, podemos observar, abriendo los nodos Salida de origen de OLE DB | Output Columns, que las columnas FirstName, LastName, MaritalStatus y Gender, tienen el tipo de dato DT_WSTR en la propiedad DataType (panel derecho de este editor). DT_WSTR es el tipo de dato que SSIS utiliza para representar los datos nvarchar de SQL Server.

 

Realizaremos la misma operación (abrir la ventana del editor avanzado) para el destino dest_Cliente, observando en esta ocasión, al abrir los nodos Entrada de destino de OLE DB | External Columns, que las columnas Nombre, Apellido, EstadoCivil y Sexo de la tabla destino, que previamente vinculamos, tienen como tipo de dato DT_STR, que es el utilizado por SSIS para representar los datos varchar de SQL Server.

 

Como ya hemos explicado, SSIS no convierte automáticamente un tipo de dato DT_WSTR a DT_STR, por lo que para subsanar el error de conversión vamos a situar, entre el origen y destino, una transformación de tipo Conversión de datos (Data Conversion Transformation), mediante la cual realizaremos la adaptación de tipos necesaria entre las columnas.

Una vez agregada esta transformación, que llamaremos conv_DimCustomer, al diseñador del flujo de datos, reubicaremos hacia la misma el Data Flow Path de src_Customer.

 

A continuación, editaremos la transformación de Conversión de datos, y en su ventana Data Conversion Transformation Editor, marcaremos en el recuadro Available Input Columns, las casillas correspondientes a las columnas provenientes del origen src_DimCustomer, las cuales pasarán al panel inferior del editor. En la columna Data Type de dicho panel cambiaremos, para las columnas FirstName, LastName, MaritalStatus y Gender, el tipo de dato a DT_STR. En la columna Output Alias, que contiene los nuevos nombres de columna que este editor asigna, modificaremos dichos nombres a los mismos que tienen las columnas originales. Finalmente, para las columnas MaritalStatus y Gender, asignaremos el valor 20 en la columna Length.

 

Una vez aceptados los cambios en el editor del convertidor de datos, arrastraremos la flecha de su Data Flow Path hasta conectarla con el destino dest_Cliente. Sin embargo, el indicador de error en el Destino de OLE DB todavía persiste

 

Esto es debido a que en el componente dest_Cliente permanece establecido el mapeo hacia las columnas de src_DimCustomer. Debemos editar el destino y establecer nuevas correspondencias entre las columnas del componente de Conversión de datos y el Destino de OLE DB, de forma que queden tal y como muestra la siguiente figura.

 

Tras este ajuste, el error habrá desaparecido.

 

Ahora volveremos a la pestaña Control Flow, donde conectaremos la flecha de restricción de precedencia (Precedence Constraint), que se origina en la tarea sql_TruncarTablas, con la tarea de flujo flw_Cliente.

 

Llegados a este punto, para comprobar que la carga de datos en la tabla Cliente se realiza correctamente, desde la ventana Solution Explorer haremos clic derecho en el paquete, eligiendo la opción Execute Package.

 

Pasando a SSMS, nos posicionaremos en la base de datos VentasAnuales, ejecutando la consulta contra la tabla Cliente que se muestra en la siguiente figura, con lo que confirmaremos que los datos se han cargado desde la tabla DimCustomer de la base de datos AdventureWorksDW2016.

 

Llegados al punto actual concluimos esta segunda parte de la serie, donde hemos explicado el proceso de carga de datos para la tabla que representará a la dimensión Cliente de nuestro próximo modelo tabular, si bien quedan pendientes de mejorar algunos detalles que trataremos en la siguiente entrega.