Using an SSIS variable in a DataFlow task - ssis

I have and SQL Execute task that gets me a list of years and save them into a an object variable, let's say "Years".
Then I have a ForEach Loop Counter that recieves thah variable, and inside that Counter I have a DataFlow task, what I want to do is use that "Years" variable in the Dataflow task as I need to use that list of years in my query.
Any suggestions on how to do that?
Oh my query in my DataFlow task is an MDX query.
Thanks

Since you need to build the MDX query dynamically and append the specific year in the counter to it, you need to:
First create a new string variable called MDX_Query.
Then esnure that the "Evaluate as expression" option is set to True
Now create an expression for that variable that is basically your MDX query and append your #Years variable to it. Something alongs the lines of
"MDX query text goes here where SalesYear.["+ #[User::Years_Variable]+"]"
Now inside your Foreach Loop task, if you have created a SQL query task, ensure that your "SQL Source Type" is set to variable and set the "Source Variable" to MDX_Query

Related

Dynamically store values from a sql query into SSIS variables

This is a two-part question. Is there a best practice approach/workaround to dynamically SET the return value from a query into an SSIS Variable using Expressions? I've researched and read the docs and it seems SSIS Variable Expressions store the value of the Expression and not the returned/runtime value.
For instance, I'd like a the retuned value of MAX date stored in the Variable called [User::MaxDate] not the query string.
Variable: [User::MaxDate]
Expression: (SELECT MAX(dateCol) AS dt FROM tblDate)
If the above is not possible, has anyone leveraged the Execute SQL Task to set values for multiple variables? The idea here is to avoid using an Execute SQL Task for each dynamic variable initailization.
My requirements are to SET initial values for 10 variables on the main control flow. I am trying to avoid using 10 Execute SQL Tasks to accomplish this.
Without using the Script Task or 3rd Party plugins is the above possible in SSIS (Version 2019)?
Thank you
For instance, I'd like a the retuned value of MAX date stored in the Variable called [User::MaxDate] not the query string.
Variable: [User::MaxDate]
Expression: (SELECT MAX(dateCol) AS dt FROM tblDate)
You are correct, you are looking to store values in an SSIS variable. A Variable with the EvaluateAsExpression property set to true means it will by dynamic but the scope of the dynamicism is the SSIS package itself.
In your case, you need to ask an external provider for information so you couldn't build an SSIS expression to satisfy that.
If you can get the 10 values you want to store in SSIS variables in a single query, then yes, you can get by with a single Execute SQL Task.
If the 10 columns are all in a single table, like a control table, then you could have a query like
SELECT
MAX(C.SalesFactDate) AS MaxSalesDate
, MAX(C.EmployeeDimDate) AS MaxEmployeeDate
-- etc
FROM
dbo.Control AS C;
If you need to get dates from the actual tables, that too can be a "single" query
SELECT
(SELECT MAX(C.SalesFactDate) FROM dbo.FactSales AS C) AS MaxSalesDate
, (SELECT MAX(C.EmployeeDimDate) FROM dbo.DimEmployees AS C) AS MaxEmployeeDate
-- etc
Either way, you will have a single row of data with 1 to N columns of data you want to associate with SSIS Variables.
On the Main task Execute SQL Task screen, change the Result Set type to Single row from None.
On the Results tab, you'll associate an SSIS variable per column. If you used OLE DB provider, the column name is the zero based ordinal. ODBC is 1 based ordinal and ADO.NET uses named entities.
Assuming I had created a variety of SSIS variables of type Date/db_date/etc and I used an OLE DB Connection manager, the screen would look like
0|#[User::SalesDate]
1|#[User::EmployeeDate]
etc

How to read first line of the flat-file containing date value and compare with a user variable defined in 2008 SSIS package without using sript task

i want to read first line of the flat-file containing date value and compare with a user variable defined in 2008 SSIS package without using sript task.
This solution is a bit long for what the simple task you require but since you don't you want to use script task, you can try below:
Create variable to store the date value from your flat file
Create a data flow task to import the flat file into a SQL table.
Add an Execute SQL task to get the first line from the SQL table and map the result
set to the variable created at step 1.
You can now compare the variable created and the one you already have.
e.g #[User::NewVariableCreated] == #[User::ExistingVariable]
This will return a Boolean data type result of True or False depending on the values supplied.
Hope this helps.
One option is to use a Conditional Split. Within this task, a condition can then be added comparing the date column of each row with the variable. A basic example of a condition for this is below, which checks to see if the date column of each row is equivalent to or more recent than the date variable. From here, the rows be directed based off whichever condition they match.
FlatFileDateColumn >= #[User::DateVariable]

SSIS - Add package variable to existing collection

I have an SSIS package in which I am returning the results of a query into a collection.
My query is returning 8 columns. For example:
first name
last name
employee
id
city
state
zip
hire-date
I am iterating through each item in the collection and do some manipulation in a For-each loop container.
I need to pass in a 9th element to the collection which is a package variable.
Example: Active_Flag
How would I go about that?
One approach I am thinking is to read the collection into an array in a script task and add the 9th element to it.
I tried this, but the collection couldn't read it and I keep getting a
"Error: The enumerator failed to retrieve element at index "9".
Any ideas how I could go about this?
There are several approaches to your problem:
Think twice - do you really need 9th row? You are iterating with a For-Each loop over an Object variable, extracting 8 rows into package variables and doing something. Adding 9th package variable to Loop logic and existing 8 variables seems easier then repackaging Object variable with OLEDB collection.
If adding 9th column makes more sense to you, you can do it in SQL query. Create package variable type String with EvaluateAsExpression=true and Expression property like
="Select ..., '"+(DT_WSTR, 10)#[User::YourVariable]+"' AS [ninethcol] from ..."
This sample adds string data, you can modify it to return desired data type.
Then set SQL Task where you extract your data with SQL Source from variable. This will inject 9th column with flexible content to the query.

Query 2 will run based on the Query1 output

The Execute SQL Task will provide us database list. Based on the list Query2 should run on all the database.
Query1 result :
databasename1
databasename2
databasename3
Query 2:
step 1
select * from databasename1.dbo.tablename
step 2
select * from databasename2.dbo.tablename
step 3
select * from databasename3.dbo.tablename
How can I use the results of a query to power subsequent queries? In my case, change the catalog name,
You can do this by using a Foreach Loop Container.
You'll need the following control flow:
Execute SQL Task -> Foreach Loop Container and another Execute SQL Task inside the container.
You'll need two variables:
DatabaseList (Object)
DatabaseName (String)
List the databases with a SQL Task
Create a user variable with Object type (DatabaseList)
On the General pane, set the ResultSet property to Full result set
On the Result Set pane set the add a new line (Result Name = 0, Variable Name = User::DatabaseList)
This will query the databases and stores the list in an object.
Note There should be one database name in one record in the first Execute SQL Task's query. Each record will be processed by the Foreach Loop.
Add a Foreach Loop Container after the SQL Command Task
On the Collection pane set the Enumerator to Foreach ADO Enumerator
Select User::DatabaseList as the ADO object source variable
On the Variable Mappings pane add a new entry (Variable = User::DatabaseName, Index = 0)
Add an Execute SQL Task inside the Foreach Loop Container and set up as normally.
Set the ResultSet property to None on the General pane.
Copy the Query to the clipoard.
Highlight the SQL Task inside the Container, then press F4 (opens the property tab).
Add a new expression which sets the SqlStatementSource property. As the Expression add an expression which returns the query with the database (based on the User::DatabaseName).
You can use expressions to dynamically set some the properties of an object. (This method also works with a Data Flow Task just the property to set (with the expression) could be different)
Note If you want to use DFT, then the tables should have the same structure (the meta data of the columns returned by the query should be the same in SSIS)

SSIS: how to read the result of a stored procedure into a global variable or something useful

I have a stored procedure i want to run which will return a 0 or a 1. I would like to store that value in a ssis variable
use a dataflow task
define the variable using the "variable" tab on the left hand side (next to the toolbox tab)
use the "exectute sql task"
in the properties of the sql task setup a result set