ssis

How to create a temporary table in SSIS control flow task and then use it in data flow task?


I have a control flow where I create a temp database and table with a T-SQL Command. When I add a dataflow I would like to query the table but I can't because the table doesn't exist to grab information from. When I try I get errors about logging in because the database doesn't exist (yet). I have set the connection manager's property DelayValidation to True.

If I create the database and table manually and then add the dataflow with query and drop the database, it sticks but it doesn't seem like a clean solution.

If there is a better way to create a temporary staging database and query it in dataflows please let me know.


Solution

  • Solution:

    Set the property RetainSameConnection on the Connection Manager to True so that temporary table created in one Control Flow task can be retained in another task.

    Here is a sample SSIS package written in SSIS 2008 R2 that illustrates using temporary tables.

    Walkthrough:

    Create a stored procedure that will create a temporary table named ##tmpStateProvince and populate with few records. The sample SSIS package will first call the stored procedure and then will fetch the temporary table data to populate the records into another database table. The sample package will use the database named Sora Use the below create stored procedure script.

    USE Sora;
    GO
    
    CREATE PROCEDURE dbo.PopulateTempTable
    AS
    BEGIN
        
        SET NOCOUNT ON;
    
        IF OBJECT_ID('TempDB..##tmpStateProvince') IS NOT NULL
            DROP TABLE ##tmpStateProvince;
    
        CREATE TABLE ##tmpStateProvince
        (
                CountryCode     nvarchar(3)         NOT NULL
            ,   StateCode       nvarchar(3)         NOT NULL
            ,   Name            nvarchar(30)        NOT NULL
        );
    
        INSERT INTO ##tmpStateProvince 
            (CountryCode, StateCode, Name)
        VALUES
            ('CA', 'AB', 'Alberta'),
            ('US', 'CA', 'California'),
            ('DE', 'HH', 'Hamburg'),
            ('FR', '86', 'Vienne'),
            ('AU', 'SA', 'South Australia'),
            ('VI', 'VI', 'Virgin Islands');
    END
    GO
    

    Create a table named dbo.StateProvince that will be used as the destination table to populate the records from temporary table. Use the below create table script to create the destination table.

    USE Sora;
    GO
    
    CREATE TABLE dbo.StateProvince
    (
            StateProvinceID int IDENTITY(1,1)   NOT NULL
        ,   CountryCode     nvarchar(3)         NOT NULL
        ,   StateCode       nvarchar(3)         NOT NULL
        ,   Name            nvarchar(30)        NOT NULL
        CONSTRAINT [PK_StateProvinceID] PRIMARY KEY CLUSTERED
            ([StateProvinceID] ASC)
    ) ON [PRIMARY];
    GO
    

    Create an SSIS package using Business Intelligence Development Studio (BIDS). Right-click on the Connection Managers tab at the bottom of the package and click New OLE DB Connection... to create a new connection to access SQL Server 2008 R2 database.

    Connection Managers - New OLE DB Connection

    Click New... on Configure OLE DB Connection Manager.

    Configure OLE DB Connection Manager - New

    Perform the following actions on the Connection Manager dialog.

    Connection Manager

    The newly created data connection will appear on Configure OLE DB Connection Manager. Click OK.

    Configure OLE DB Connection Manager - Created

    OLE DB connection manager KIWI\SQLSERVER2008R2.Sora will appear under the Connection Manager tab at the bottom of the package. Right-click the connection manager and click Properties

    Connection Manager Properties

    Set the property RetainSameConnection on the connection KIWI\SQLSERVER2008R2.Sora to the value True.

    RetainSameConnection Property on Connection Manager

    Right-click anywhere inside the package and then click Variables to view the variables pane. Create the following variables.

    Variables

    Drag and drop an Execute SQL Task on to the Control Flow tab. Double-click the Execute SQL Task to view the Execute SQL Task Editor.

    On the General page of the Execute SQL Task Editor, perform the following actions.

    Execute SQL Task Editor

    Drag and drop a Data Flow Task onto the Control Flow tab. Rename the Data Flow Task as Transfer temp data to database table. Connect the green arrow from the Execute SQL Task to the Data Flow Task.

    Control Flow Tab

    Double-click the Data Flow Task to switch to Data Flow tab. Drag and drop an OLE DB Source onto the Data Flow tab. Double-click OLE DB Source to view the OLE DB Source Editor.

    On the Connection Manager page of the OLE DB Source Editor, perform the following actions.

    OLE DB Source Editor - Connection Manager

    Clicking Columns page on OLE DB Source Editor will display the following error because the table ##tmpStateProvince specified in the source command variable does not exist and SSIS is unable to read the column definition.

    Error message

    To fix the error, execute the statement EXEC dbo.PopulateTempTable using SQL Server Management Studio (SSMS) on the database Sora so that the stored procedure will create the temporary table. After executing the stored procedure, click Columns page on OLE DB Source Editor, you will see the column information. Click OK.

    OLE DB Source Editor - Columns

    Drag and drop OLE DB Destination onto the Data Flow tab. Connect the green arrow from OLE DB Source to OLE DB Destination. Double-click OLE DB Destination to open OLE DB Destination Editor.

    On the Connection Manager page of the OLE DB Destination Editor, perform the following actions.

    OLE DB Destination Editor - Connection Manager

    Click Mappings page on the OLE DB Destination Editor would automatically map the columns if the input and output column names are same. Click OK. Column StateProvinceID does not have a matching input column and it is defined as an IDENTITY column in database. Hence, no mapping is required.

    OLE DB Destination Editor - Mappings

    Data Flow tab should look something like this after configuring all the components.

    Data Flow tab

    Click the OLE DB Source on Data Flow tab and press F4 to view Properties. Set the property ValidateExternalMetadata to False so that SSIS would not try to check for the existence of the temporary table during validation phase of the package execution.

    Set ValidateExternalMetadata

    Execute the query select * from dbo.StateProvince in the SQL Server Management Studio (SSMS) to find the number of rows in the table. It should be empty before executing the package.

    Rows in table before package execution

    Execute the package. Control Flow shows successful execution.

    Package Execution  - Control Flow tab

    In Data Flow tab, you will notice that the package successfully processed 6 rows. The stored procedure created early in this posted inserted 6 rows into the temporary table.

    Package Execution  - Data Flow tab

    Execute the query select * from dbo.StateProvince in the SQL Server Management Studio (SSMS) to find the 6 rows successfully inserted into the table. The data should match with rows founds in the stored procedure.

    Rows in table after package execution

    The above example illustrated how to create and use temporary table within a package.