ETL Magic with SSIS part 1 - RJ's SQL Server and · PDF fileETL Magic with SSIS Page 3 Ron...

12
ETL Magic with SSIS Page 1 Ron Johnson ETL Magic with SSIS – Part I Ron Johnson Introduction This paper will demonstrate a process for loading a commadelimited data file into a staging table for further processing then validating the data and moving specific data into host tables. There are several excellent papers and tutorials individually describing simple data load processes, errorhandling, logging, etc. using SSIS but I haven’t found a source demonstrating a process starttofinish which motivated me to write this paper. The intended audience includes beginning SSIS developers, DBAs, and anyone with a desire to experience the magic of data management with this remarkable tool. A significant challenge in producing this paper was the identification of a data set that was nontrivial, not proprietary, yet allowed the demonstration of important techniques available in SSIS. I settled on using a data set I downloaded from a U.S. government WWW site containing data produced using taxpayer dollars thus publically available. The data set is the Worldwide M1+ Earthquakes, Past 7 Days csv file available at http://explore.data.gov/catalog/raw/. I’ve included ample screen shots where appropriate (please note that the following screen shots are of my local system’s directory structure, etc.) as well as attempted to describe the process as clearly and concisely as possible without insulting anyone’s intelligence; however, be forewarned that finding the balance between too much or not enough detail is a challenge unto itself. In developing this paper it quickly become apparent that a complete treatment of the sample ETL project would be too involved for a single paper; therefore, I divided the paper into two parts where I believe the division makes sense. Taken together the two parts of the paper provide, in my opinion (biased as it is), a thorough example of a nontrivial ETL project using “real” data. For the record, I use the terms Task and Transformation synonymously SSIS purest would say that this is incorrect I accept their judgment (although, I would argue that the definition of a “task” may generically include a transformation. For the novice, a Task acts upon the Control Flow while a Transformation acts upon the Data Flow). Preliminaries: Setting up SQL Server Configuration Depending on the environment some values used by the package may change when the package is moved from development to production. Personally, I store my packages in SQL Server after development and have no desire to revisit the package in BIDS to change connections or other values. Again, there are choices mine is to use SQL Server configuration rather than environment variables, XML, or registry settings, etc. it’s just my choice it doesn’t have to be yours. To setup SQL Server configuration we first want to create an Environment Variable to define the connection string to the package’s configuration database. Call the Environment Variable SSISConfigurationDatabase (or, whatever strikes your fancy) and set its value to the connection string for the server / instance / database where you will store the other configuration values. What does this do? It allows us to control where the package will look for its configuration data.

Transcript of ETL Magic with SSIS part 1 - RJ's SQL Server and · PDF fileETL Magic with SSIS Page 3 Ron...

ETL Magic with SSIS   Page 1 Ron Johnson  

ETL Magic with SSIS – Part I Ron Johnson 

Introduction This paper will demonstrate a process for loading a comma‐delimited data file into a staging table for further processing then validating the data and moving specific data into host tables.  There are several excellent papers and tutorials individually describing simple data load processes, error‐handling, logging, etc. using SSIS but I haven’t found a source demonstrating a process start‐to‐finish which motivated me to write this paper.  The intended audience includes beginning SSIS developers, DBAs, and anyone with a desire to experience the magic of data management with this remarkable tool. 

A significant challenge in producing this paper was the identification of a data set that was non‐trivial, not proprietary, yet allowed the demonstration of important techniques available in SSIS.  I settled on using a data set I downloaded from a U.S. government WWW site containing data produced using taxpayer dollars thus publically available.  The data set is the Worldwide M1+ Earthquakes, Past 7 Days csv file available at http://explore.data.gov/catalog/raw/.   

I’ve included ample screen shots where appropriate (please note that the following screen shots are of my local system’s directory structure, etc.) as well as attempted to describe the process as clearly and concisely as possible without insulting anyone’s intelligence; however, be forewarned that finding the balance between too much or not enough detail is a challenge unto itself.   

In developing this paper it quickly become apparent that a complete treatment of the sample ETL project would be too involved for a single paper; therefore, I divided the paper into two parts where I believe the division makes sense.  Taken together the two parts of the paper provide, in my opinion (biased as it is), a thorough example of a non‐trivial ETL project using “real” data.  For the record, I use the terms Task and Transformation synonymously SSIS purest would say that this is incorrect I accept their judgment (although, I would argue that the definition of a “task” may generically include a transformation.  For the novice, a Task acts upon the Control Flow while a Transformation acts upon the Data Flow). 

Preliminaries: Setting up SQL Server Configuration Depending on the environment some values used by the package may change when the package is moved from development to production.  Personally, I store my packages in SQL Server after development and have no desire to revisit the package in BIDS to change connections or other values.  Again, there are choices mine is to use SQL Server configuration rather than environment variables, XML, or registry settings, etc. it’s just my choice it doesn’t have to be yours. 

To setup SQL Server configuration we first want to create an Environment Variable to define the connection string to the package’s configuration database.  Call the Environment Variable SSISConfigurationDatabase (or, whatever strikes your fancy) and set its value to the connection string for the server / instance / database where you will store the other configuration values.   What does this do?  It allows us to control where the package will look for its configuration data. 

ETL Magic with SSIS   Page 2 Ron Johnson  

With the Environment Variable defined we now create a new Integration Services Project in BIDS.  Create a connection manager for the database that either contains or will contain the configuration table.  In my case the table already exists because I created it for other projects.  If you don’t have a table we’ll create one in a few minutes.   

With the connection manager defined right‐click on the design surface and select Package Configurations…, ensure that the Enable package configurations checkbox is checked.  Select the Add… button then configure the selections as shown below: 

 

When you click the Next > button the workflow will ask you to “Select the property which will have its value set by the configuration.” as shown below: 

 

ETL Magic with SSIS   Page 3 Ron Johnson  

Select the ConnectionString property belonging to the connection manager we just created.  

That’s it!  We now have an externally configurable connection to the database that stores the other configuration properties for the package.   

Priming the Process Although configuring a data source in SSIS to retrieve the data file from a WWW site is a straightforward process the more realistic scenario, in my experience, is that a client delivers a data file via ftp, web service, etc.; therefore, our example will assume that the data file is delivered to a specific directory designated to receive ftp transmissions. 

So, we want to look in a directory for a file that will be processed by our package.  Do we know when the file will be delivered? Do we know when the transmission of the file will be complete?  If so, then the problem is somewhat simplified because we just pick the file up out of the directory; however, again, in my experience, the file may be there or it may be getting there giving us the option to either fail the package if the file is not available executing the package again at a later time or we can wait for the file to be ready. 

As with any programming endeavor there is always more than one approach to solving a problem.  In this case I’ve tried a few approaches before I found a very reliable component called the File Watcher Task contributed to the SSIS community by Konesans and available here (please note the component’s accompanying license).  This clever little component greatly simplified my packages allowing execution at time t while the data source file may not be available until sometime after t.  

First, we need to create a Flat File connection manager to our data.  Enter double quotes (“) in the Text qualifier property’s textbox and check the Column names in the first data row checkbox as shown below: 

 

ETL Magic with SSIS   Page 4 Ron Johnson  

Take a peek at the columns by selecting the Columns view: 

 

Not bad, with very little effort SSIS has parsed the data file for us.  If we wanted to change the names of the columns or the data types assigned to them we select the Advanced view: 

 

Personally, I prefer to give SSIS the first shot at defining the data types.  To accomplish this I select the Suggest Types button: 

ETL Magic with SSIS   Page 5 Ron Johnson  

 

I change the Number of rows value to 1000 then click OK. 

Examine the individual column definitions; it appears that everything is acceptable except for the Datatime column which is defined as a string(42).  Before we leave the Advanced view note that this is where the names of the columns can be modified and columns can be added or deleted. 

Click on the Preview view to examine the expected output: 

 

From this we can see why the Datetime field is string(42). 

Storing the Flat File ConnectionString in the Configuration Database To access the Package Configurations Organizer right‐click on the Control Flow design surface then select the Add button. 

ETL Magic with SSIS   Page 6 Ron Johnson  

 

Earlier we defined the Environment Variable that stores the location of the configuration database now we will create a new table to store the package configurations like the FlatFile Connection Manager.   

If you have previously created a Configuration table select it; otherwise select the New… button.  The Configuration table is defined as: 

CREATE TABLE [dbo].[SSIS Configurations] (   ConfigurationFilter NVARCHAR(255) NOT NULL,   ConfiguredValue NVARCHAR(255) NULL,   PackagePath NVARCHAR(255) NOT NULL,   ConfiguredValueType NVARCHAR(20) NOT NULL )  The Configuration filter is an identifier allowing the segregation of package configurations within the table; type in a useful identifier for this value.  The storage system for package configuration values is complete.   Select the values from the FlatFile Connection Manager to store in the configuration table as shown below: 

ETL Magic with SSIS   Page 7 Ron Johnson  

 

The Package Configuration Organizer should now look like this: 

 

Execute the following query to examine the configuration values stored in the configuration table for our package: 

SELECT [ConfigurationFilter] ,[ConfiguredValue] ,[PackagePath] ,[ConfiguredValueType] FROM [test].[dbo].[SSISConfigurations] WHERE Configurationfilter like 'Earth%'

ConfigurationFilter  ConfiguredValue  PackagePath ConfiguredValueTypeEarthQuakeData  C:\SSIS Paper\worldwide M1+ Earthquakes 

‐ 7 Days.txt \Package.Connections[EarthquakeData].Properties[ConnectionString]  String

Begin When Ready Follow the directions for installing the Konesans File Watcher Task component and adding it to the toolbox.  Then, drag a File Watcher Task onto the Control Flow design surface.  My policy is to rename a component as soon as I drop it onto 

ETL Magic with SSIS   Page 8 Ron Johnson  

the design surface because I find this approach helps me stay organized so rename the File Watcher Task.  While we’re at it, let’s set the file name Filter, the Path, and change the value of the Find Existing Files property as shown below: 

 

Once the File Watcher Task is configured you can run the package; the File Watcher Task will find the EarthQuakeData file in the specified directory and turn green – Success!  If the data file is not found, then the File Watcher Task will turn yellow waiting for the file to become available making this component a very welcome addition to the SSIS toolbox. 

Staging Now that our package will control its own execution based on when a file is available from a client our focus shifts to the processing of the data into a staging table.  First, drag a Data Flow Task onto the design surface; connect the EarthQuakeData File Watcher Task by dragging its green output arrow onto the Data Flow Task.  The Control Flow design surface should look like this: 

ETL Magic with SSIS   Page 9 Ron Johnson  

 

Double click on the Data Flow Task to switch to the Data Flow design surface.  Our destination is a SQL Server instance and the source is a flat file so drag both from the toolbox onto the design surface.   Connect the Flat File Source to the SQL Server Destination by dragging its green output arrow onto the SQL Server Destination.  The Data Flow design surface should look like this: 

 

Notice the red circle with the ‘X’; this is telling us that the component is not properly configured. 

Because SSIS uses the metadata from upstream components to seed the configuration values of the downstream components we start configuration with the Flat File Source component.  Double click on the component to popup this dialogue pre‐populated with the EarthQuakeData connection manager we previously created: 

ETL Magic with SSIS   Page 10 Ron Johnson  

 

Press the Preview button to view the data from the flat file.   

Click on the Columns view to select / unselect and rename columns for output. 

Click on the Error Output view to define the action the component should take if an error occurs during the processing of a row of data from the flat file input.  For our example we will accept the defaults. 

Double click the SQL Server Destination component.  As mentioned above SSIS uses the metadata created during the configuration of the Flat File Source to seed the configuration values of the SQL Server Destination.  Create a connection manager for the database where the Earthquake data will be loaded.  If the data is to be loaded into an existing table, then select that table from the Use a table or view drop down; otherwise, press the New button which will generate the Create Table script as shown below: 

ETL Magic with SSIS   Page 11 Ron Johnson  

 

Add an ID column of type int IDENTITY(1,1) to the CREATE TABLE command. 

The SQL Destination Editor should look like this: 

 

Click on the Mappings view to see how the output columns from the Flat File Source will map to the columns in the database table.   Take a look at the other available configuration settings in the Advanced view, then click the OK button. (Note: this connection manager may also be included in the package configurations as simply as the Flat File Connection Manager; I leave doing so to the reader.) 

Run the package.  The two tasks on the Data Flow design surface should have turned green – Success!  Examine the database; the flat file data is loaded in the table SQL Server EarthQuake Data Table.   

ETL Magic with SSIS   Page 12 Ron Johnson  

 

With just a few mouse clicks we have created a process to read the source file into the database.  Work remains to be done so drop the SQL Server EarthQuake Data Table containing the imported data. 

Summary Pretty, pretty, pretty straightforward.  Again, in practice I do not like to modify a tested package which is why I use the package configurations as I do.  I would argue that externalizing the package configurations is an “SSIS Best Practice”.  The ETL tasks included in Part I of this paper are an introduction to the power and simplicity of SSIS; Part II takes this example to the next level introducing validations and transformations, error handling, and distribution of the data.