Last weekend I presented at SQL Saturday in Redmond WA. One attendee asked if it was possible to use values from the Package configuration file as parameters to a SQL Task. The answer was a definite yes, although I didn’t have a good example. This post aims to fix that.
Let’s start with the basic workflow. First you will need to create a variable, this variable will be used to pass the value from the config file to the SQL statement. Next you will need to establish a package configuration file, to hold the configured value. After that you will create an Execute SQL Task. In the input statement for the task, simply use ? for each parameter in the T-SQL statement. Finally you’ll click on the Parameter Mapping area of the SQL Task and map the variable to the position of each ?.
Now that you have a basic overview of where we’re going, let’s start this example by creating a simple table to update. Pick your favorite database, or create a test one, then run a simple script to create a table. I used my ArcaneCode database, which I use for samples, and created a table named TestParamToProcs in the dbo schema.
USE [ArcaneCode]
GO
/****** Object: Table [dbo].[TestParamToProcs] Script Date: 10/06/2009 21:45:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestParamToProcs](
[ID] [int] IDENTITY(1,1) NOT NULL,
[SomeText] [nvarchar](50) NULL,
CONSTRAINT [PK_TestParamToProcs] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Now let’s create a new package. I started by opening BIDS (Business Intelligence Developer Studio), creating a solution and named it ConfigFileToSqlParams. I added a Shared Data Source to connect to my database. Next I renamed the default package to ParamToProcs.dtsx. I added the shared data source to the connection managers area of the package.
OK, that takes care of the basics. Next we need to setup the package for variables and a config file. Open up the variables window (click in the Control Surface area, and in the SSIS menu pick Variables.) Create a new variable, we’ll call it MyParam. Make it a string and insert the value of “X” into it.
Now right click on the Control Flow surface (all that yellow area in the Control Flow tab) and pick Package Configurations. Click the check box to “Enable package configurations”, then click the Add button at the bottom of the screen. You are now presented with the Package Configuration Wizard. The first screen is just a welcome screen, you can click past it. The next screen is the “Select Configuration Type” screen. Make sure the default of “XML configuration file” is selected in the drop down. Next under “Specify configuration files directly” enter the path and file name for your config XML file. I named mine ParamToProcsConfig.xml and clicked Next.
The next step in the wizard is the “Select Properties to Export” screen. Expand the Variables area in the tree, then the tree for MyParam, then Properties. Now make sure the only box checked is the one for “Value”.
Click Next once your screen looks like the one above, and you’ll be at the completion screen. Give your package config a good name, I used MyParamConfig, and clicked Finish.
Now let’s drop 3 SQL Tasks into the Control Flow surface. The first task will simply delete all the rows in the table that was just created. That way we can run the package repeatedly. For all three tasks set the Connection to the shared source you added in the Connection Managers area. Now for the SQLStatement of our first task, we’ll use Direct Input and enter this SQL statement:
DELETE FROM dbo.TestParamToProcs
For the next SQL task we’ll insert a row into our table to manipulate. Use this for the SQL Statement property.
INSERT INTO dbo.TestParamToProcs (SomeText) VALUES (‘Hello’)
OK, those were fairly easy and straight forward. Now comes the fun part. For the next SQL Task, we’ll use this statement for the SQLStatement property.
UPDATE dbo.TestParamToProcs SET SomeText = ?
Note the use of the ? (question mark) for the value of the SomeText field. This is the parameter. Now we need to supply a value to this parameter. Over on the left, click the Parameter Mapping tab. Click Add and a new row will be placed in the grid. In the first column, Variable Name, from the drop down pick “User::MyParam”. Leave the Direction as “Input”. Since this is a string variable, we’ll need to change the Data Type column to “VARCHAR”. Finally we need to set the Parameter Name, For this we’ll enter a 0 (zero). We’ll leave the Parameter Size at the default of –1.
When your dialog resembles this one, you can click OK. If you needed to use more than one parameter, just use ? for each place where a parameter would go in your T-SQL statement. Then use the values of 0, 1, 2 etc for the Parameter Name. 0 will map to the first ?, 1 to the second, and so on. OK at this point your SSIS package should look something like:
If you now run the package, then jump into SQL Server Management Studio and run a “SELECT * FROM dbo.TestParamToProcs”, you should see one row with the SomeText column set to X. Great! Now lets give it one more test. We should change the config file, and run the package outside of BIDS.
First, open notepad or some other text editor, then open up the ParamToProcsConfig.XML file. Move to the <ConfiguredValue> tags, and change the X to something else. I used “ArcaneCode” as it was rather spiffy, but you can use your name, or your cat’s name if you like. Save the file and you can close your text editor.
Now let’s use dtexec to run our package. Open up a command window and navigate to the folder where your package is located. I then used the dtexecui utility to create a package execution command. I’d encourage you to play with this, but so we’re all on the same page here is the dtexec command line I came up with:
dtexec /FILE "D:\Presentations\SQL Server\ConfigFileToSqlParams\ConfigFileToSqlParams\ConfigFileToSqlParams\ParamToProcs.dtsx" /CHECKPOINTING OFF /REPORTING EW
Of course you’ll want to change the path to wherever you have the ParamToProcs.dtsx package. You should be able to run the above command line and execute your package. If you the jump back to SSMS and rerun the “SELECT * FROM dbo.TestParamToProcs”, you should now see the row with the new value from the config file.
To summarize, the basic steps are:
1. Create the variable
2. Store the variable in a package configuration XML file.
3. Create a SQL Task. Use ? for the parameters in the T-SQL statement.
4. Map the variables to the parameters.
5. Run. Be happy.
And that’s all there is to it.
Great post! I’ve been trying to move the parts of my packages that require manual editing to config files, but had never considered using this technique to feed parameterized queries (at least those that don’t get values dynamically). This will become a part of my sop going forward.
Hey Now Robert Arcancode,
Just heard your great email on DNR regarding SSIS & .NET. Also I”ve enjoyed your blog for some time now with a mix of technology & people posts.
Thx 4 the info,
Catto
I m clear on that we have to create xml.config file or it will automatically gets created cz when we need to specify path and xml file name m nt able to go further . Please help me on this.
I have created a SSIS ODBC Relativity accessed through COBOL tables where I use the DataReader Source to get the data from COBOL using the query requires a parameter but when I try to map the variable is not my choice, help me, please
Sheway – not sure where you are getting xml.config from? Didn’t mention it in this post so I’m a bit confused.
Richard not quite sure I understand your issue either. If you are pulling data but need to use a parameter as part of your source query there’s no easy way to do it as you would with a execute sql task. I would let the DataReader Source be a variable, in the variable put your SELECT statement. Then at run time use a Scripting task (at the control level, not the data flow level) to alter the value of the variable and add a WHERE to the end of your SELECT with the needed parameters.
Is there any possible way to map a variable from your package configuration to your SSIS package?? I’m just trying to open a particular flat file whose folder and file name are stored in my package config. The folder is easy using the Foreach Loop container, but how do you specify the file name that’s stored in my package config? There seems to be no mechanism of just filtering out a file variable without hard-coding it in the package.
Geez – found the problem! Let this be a valuable lesson for everyone out there!
The problem turned out to be nothing more than the wrong collation for the fields in the config file on SQL Server.
Try to find that solution in the literature out there!