When you need it and how to use it?
As you may know table variable is similar to temp table in Microsoft SQL, however; table variable generally uses fewer resources. I am going to explain when table variable could be useful at the time of SSIS package development.
Scenario 1: When you need to store data like array and need to use it later in your SSIS package
For example, below scenario I only had to insert/update data where the periods exist in the source data and then making next operation depend on the value exist or not.
DECLARE @periodACD TABLE (periodACD char(2))
INSERT INTO @periodACD
SELECT Distinct [PERIOD]
FROM [ETL].[SourceTable];
SELECT CASE WHEN periodACD='4' THEN 'Insert or update for April' END /*You can use any transformation or calculation at THEN clause.*/
FROM @periodACD WHERE periodACD='4'
Scenario 2: Keep insert or updated row count for logging purposes while you use SQL Merge
For example, you are using merge to update the dimension and want to catch the number of rows you insert, you can use table variable to store the data for merge.
DECLARE @RowCount TABLE (InsertedID INT) --Declare Table variable
MERGE [Dim].[Table] AS Target
USING [Staging].[Data] as Source
ON Target.SourceID = Source.SourceID --BusinessKey
WHEN MATCHED
AND (ISNULL(Source.SourceName,'')<>ISNULL(target.[BrandDesc],'')
OR ISNULL(Source.SourceDate,0)<>ISNULL(Target.SourceDate,0)
OR ISNULL(Source.SourceBit,'')<>ISNULL(Target.SourceBit,'')
THEN
UPDATE SET Target.SourceName = Source.SourceName,
Target.SourceDate = Source.SourceDate,
Target.SourceBit = Source.SourceBit
OUTPUT inserted.SourceID 'InsertedID' INTO @RowCount; --output IDs for rowcount
SELECT COUNT(*)
FROM @RowCount
As you may know table variable is similar to temp table in Microsoft SQL, however; table variable generally uses fewer resources. I am going to explain when table variable could be useful at the time of SSIS package development.
Scenario 1: When you need to store data like array and need to use it later in your SSIS package
For example, below scenario I only had to insert/update data where the periods exist in the source data and then making next operation depend on the value exist or not.
DECLARE @periodACD TABLE (periodACD char(2))
INSERT INTO @periodACD
SELECT Distinct [PERIOD]
FROM [ETL].[SourceTable];
SELECT CASE WHEN periodACD='4' THEN 'Insert or update for April' END /*You can use any transformation or calculation at THEN clause.*/
FROM @periodACD WHERE periodACD='4'
Scenario 2: Keep insert or updated row count for logging purposes while you use SQL Merge
For example, you are using merge to update the dimension and want to catch the number of rows you insert, you can use table variable to store the data for merge.
DECLARE @RowCount TABLE (InsertedID INT) --Declare Table variable
MERGE [Dim].[Table] AS Target
USING [Staging].[Data] as Source
ON Target.SourceID = Source.SourceID --BusinessKey
WHEN MATCHED
AND (ISNULL(Source.SourceName,'')<>ISNULL(target.[BrandDesc],'')
OR ISNULL(Source.SourceDate,0)<>ISNULL(Target.SourceDate,0)
OR ISNULL(Source.SourceBit,'')<>ISNULL(Target.SourceBit,'')
THEN
UPDATE SET Target.SourceName = Source.SourceName,
Target.SourceDate = Source.SourceDate,
Target.SourceBit = Source.SourceBit
OUTPUT inserted.SourceID 'InsertedID' INTO @RowCount; --output IDs for rowcount
SELECT COUNT(*)
FROM @RowCount