Creating temp tables in SSIS seems like a straight-forward process
using the Execute SQL Task, however there are a couple of properties
that must be changed. In this tip, we’ll walk through creating a simple
temp table in SSIS.
Next, I will right click and edit and choose my connection and SQLStatement:
Next, I will drag a Data Flow task into my Design view, rename it Query and drag the precedence constraint between the two:
For the Data Flow task we are going to query the temp table and
export the results to a database table. Right click the Data Flow task
and choose Edit. Drag a OLE DB Source and a OLE DB Destination task into
the Design view.
To avoid errors when configuring the OLE DB Source we need to create
the temp table first using SSMS. In SSMS run the following statement to
create a global temp table:
Once the table has been created, let’s go back into our SSIS package.
Right click OLE DB Source and choose Edit. Choose your data source and
choose SQL command for the Data access mode dropdown. In the SQL command
text we will need to create our SQL statement:
Hit OK on the OLE DB Source window and right click OLE DB Destination
and choose Edit. Choose your datasource and choose "Table or View –
fast load" from the Data access mode dropdown. I already created a table
called AlabamaTeams that I will use to display the data and will use
this name in the dropdown for the Name of the table or the view.
Once finished configuring the OLE DB Destination hit OK. We are now
ready to execute the package. Hit F5 to begin or choose Debug, Start
Debugging from the Menu bar:
After executing the package, an error will occur on the Query task:
If we look at the Progress tab we can see that the reason this error
occurs is because after the temp table is created in the “Create Temp
Table” task it is deleted. The “Query” task searches for the table but
can’t find it.
The second property we must change is the Execute SQL Task property.
If you right click on each task (Create Temp Table and Query) and choose
properties you will see a property called DelayValidation. This must be
set to “True”. DelayValidation means that the task will not check if
the table exists upon creation.
Once we have set both properties to “True”, execute the package again. The package should be successful this time:
If we switch back over to SSMS and query the table, AlabamaTeams, we should return a result set:
**Note: I’m using global temp tables (##tmpTeams) instead of local
temp tables (#tmpTeams) because when I create the table using SSMS the
first time it uses a different session (SPID) therefore when I try to
configure my OLE DB Source it cannot find the temp table and gives the
following error:
With that said, only global temp tables should be used. Also, make
sure when you are creating your global temp tables that the table name
does not interfere with any other global temp tables that may be created
using other processes.
Creating Sample SSIS Package
First, I will drag an Execute SQL Task into my Design view and rename it Create Temp Table:
(The SQL statement used in this example is below)
IF OBJECT_ID('tempdb..##tmpTeams') IS NOT NULL DROP TABLE ##tmpTeams CREATE TABLE ##tmpTeams ( Team VARCHAR(255), Mascot VARCHAR(255), State VARCHAR (2) ) INSERT INTO ##tmpTeams VALUES ('Auburn', 'Tigers', 'AL'), ('Alabama', 'Crimson Tide', 'AL'), ('Mississippi', 'Rebels', 'MS'), ('Louisiana State', 'Tigers', 'LA'), ('Mississippi State', 'Bulldogs', 'MS'), ('Arkansas', 'Razorbacks', 'AR'), ('Texas A&M', 'Aggies', 'TX'), ('Georgia', 'Bulldogs', 'GA'), ('Tennessee', 'Volunteers', 'TN'), ('Vanderbilt', 'Commodores', 'TN'), ('Florida', 'Gators', 'FL'), ('South Carolina', 'Gamecocks', 'SC'), ('Missouri', 'Tigers', 'MO')
CREATE TABLE ##tmpTeams ( Team VARCHAR(255), Mascot VARCHAR(255), State VARCHAR (2) )
Fixing the Issue
To fix this issue, we will need to change a few properties on the tasks and connection manager. The first property is a connection manager property. If you right click the OLEDB Connection Manager and choose properties you will see a property called RetainSameConnection. This must be set to “True”. RetainSameConnection means that the temp table will not be deleted when the task is completed.Next Steps
- I would assume that when creating a temp table inside a SSIS package that other tasks in the package will use the temp table, therefore I suggest adding another task that will drop the temp tables at the end of the package. For example, DROP TABLE ##tmpTeams.
No comments:
Post a Comment