<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://agilebi.com/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">BI Thoughts and Theories</title><subtitle type="html" /><id>http://agilebi.com/cs/blogs/jwelch/atom.aspx</id><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/default.aspx" /><link rel="self" type="application/atom+xml" href="http://agilebi.com/cs/blogs/jwelch/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61129.2">Community Server</generator><updated>2008-06-19T05:52:21Z</updated><entry><title>PASS Summit 2008</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/pass-summit-2008.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/pass-summit-2008.aspx</id><published>2008-09-18T01:15:55Z</published><updated>2008-09-18T01:15:55Z</updated><content type="html">&lt;p&gt;&lt;em&gt;Last post on presentations for a while, I think / hope.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I'll be presenting on Unit Testing in SSIS at the &lt;a href="http://summit2008.sqlpass.org/"&gt;PASS Summit 2008&lt;/a&gt;, occurring in Seattle, WA from Nov. 18-21. There's lots of great content planned at PASS this year, and it's definitely worth attending. If you are there, drop by the session and say hello.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=219" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SQL Server" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SQL+Server/default.aspx" /><category term="BI" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/BI/default.aspx" /><category term="PASS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/PASS/default.aspx" /></entry><entry><title>The Microsoft BI Conference</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/the-microsoft-bi-conference.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/the-microsoft-bi-conference.aspx</id><published>2008-09-18T00:58:30Z</published><updated>2008-09-18T00:58:30Z</updated><content type="html">&lt;p&gt;I'm doing a couple of chalk talks at the &lt;a href="http://www.msbiconference.com/Pages/default.aspx"&gt;Microsoft BI Conference&lt;/a&gt;, occurring in Seattle, WA on October 6-8. The chalk talks are a different format than the typical presentation: smaller audience, no (or very few) slides, and more conversational in format. I'm doing one on unit testing for SSIS, and another on building custom components for SSIS. I really enjoy the chalk talk format, and I'm looking forward to some good conversations. If you are planning on being at the conference, please stop by.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=218" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /><category term="BI" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/BI/default.aspx" /></entry><entry><title>SQL Saturday in Greenville, SC</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/sql-saturday-in-greenville-sc.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/sql-saturday-in-greenville-sc.aspx</id><published>2008-09-18T00:41:34Z</published><updated>2008-09-18T00:41:34Z</updated><content type="html">&lt;p&gt;There's a &lt;a href="http://www.sqlsaturday.com/eventhome.aspx?eventid=12"&gt;SQL Saturday&lt;/a&gt; coming up in Greenville, SC on October 11th. It's a free, day long event with a number of great speakers doing sessions. I don't include myself in the great speaker category, but I was asked to present a couple of sessions on SSIS, including one on data profiling in the ETL process, one of my favorite topics.&lt;/p&gt;  &lt;p&gt;Again, it's free and there's some great content, so if you are in the area or close by, you should check it out.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=217" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SQL Server" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SQL+Server/default.aspx" /><category term="BI" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/BI/default.aspx" /></entry><entry><title>The SSWUG BI Virtual Conference Is Moving...</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/the-sswug-bi-virtual-conference-is-moving.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/18/the-sswug-bi-virtual-conference-is-moving.aspx</id><published>2008-09-18T00:33:00Z</published><updated>2008-09-18T00:33:00Z</updated><content type="html">&lt;P&gt;but not very far, just to Nov. 5-7. In order to provide more value to attendees, the BI conference is being run at the same time as the SharePoint, SQL, and .NET conferences. So now, instead of just having access to the BI content, you'll be able to pick and choose session from all four conferences. Personally, I love the idea of 3 days of solid BI content, but if you like a little more variety, this should be great.&lt;/P&gt;
&lt;P&gt;Check in at &lt;A title=http://www.vconferenceonline.com/Business-Intelligence/ href="http://www.vconferenceonline.com/Business-Intelligence/"&gt;http://www.vconferenceonline.com/Business-Intelligence/&lt;/A&gt; to see the updated information.&lt;/P&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=216" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="BI" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/BI/default.aspx" /></entry><entry><title>Presenting at the Triad SQL Server User Group</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/16/presenting-at-the-triad-sql-server-user-group.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/16/presenting-at-the-triad-sql-server-user-group.aspx</id><published>2008-09-16T02:21:29Z</published><updated>2008-09-16T02:21:29Z</updated><content type="html">&lt;p&gt;I'm presenting at the Triad SQL Server User Group tomorrow night on Migrating to Reporting Services 2008. It was a lively group last time I was there, and I'm looking forward to visiting them again. If you are in the area, please stop by.&lt;/p&gt;  &lt;p&gt;Here's the abstract for the presentation:&lt;/p&gt;  &lt;p&gt;With the new and enhanced capabilities that Reporting Services 2008 offers, more and more companies are evaluating a migration from other reporting technologies to Reporting Services. This session will cover the commonly needed steps in a migration process from both project planning and technical delivery perspectives. Commonly used patterns in migrations will also be discussed. There will be specific focus on how ad-hoc reporting environments can be set up while leveraging the new features in 2008.&lt;/p&gt;  &lt;p&gt;They are currently having some problems with their site (at &lt;a href="http://www.triadsql.com"&gt;www.triadsql.com&lt;/a&gt;) but if you need directions, you can get them from the Triad Developers Group site here: &lt;a title="https://webmail.mariner-usa.com/exchweb/bin/redir.asp?URL=http://www.triaddev.org/directions/" href="http://www.triaddev.org/directions/"&gt;http://www.triaddev.org/directions/&lt;/a&gt;. They meet at the same location.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=214" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="Reporting Services 2008" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Reporting+Services+2008/default.aspx" /></entry><entry><title>Error Redirection with the OLE DB Destination</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/09/05/error-redirection-with-the-ole-db-destination.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/09/05/error-redirection-with-the-ole-db-destination.aspx</id><published>2008-09-05T07:43:30Z</published><updated>2008-09-05T07:43:30Z</updated><content type="html">&lt;p&gt;A question that comes up occasionally is how to handle errors that occur on the OLE DB Destination in the data flow. Errors that occur when using the OLE DB Destination to insert into a table are usually caused by primary key, foreign key, or check constraints violations. When one of these errors occurs, the default behavior of the OLE DB Destination is to fail and not insert any rows, even the good ones. So the question is, &amp;quot;How can you insert the good rows, while redirecting the bad rows somewhere else?&amp;quot;&lt;/p&gt;  &lt;p&gt;There is always the option of preprocessing the data prior to sending it to the OLE DB Destination, to ensure that no constraints will be violated. However, this usually means that you are incurring the validation cost twice - once up front, and then again before you insert into the table. You can drop and recreate the constraints on the table, but this incurs some performance penalties itself. As usual with anything dealing with performance, your mileage may vary, so the best way to see which performs best for you is to test it in your environment.&lt;/p&gt;  &lt;p&gt;Another approach is to leave the constraints intact on the destination table, and handle the constraint violations through error redirection. You can enable error redirection on the OLE DB Destination, but you have to change the &amp;quot;Maximum insert commit size&amp;quot; property to make it work. By default, this value is set so that the entire set of rows going to the database is committed at once. A failure to insert one rows means that no rows will be inserted. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="484" alt="image" src="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image_thumb.png" width="558" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you set this to a value of one, the OLE DB Destination will only try to commit a single row at time. The problem with this is that single row inserts are painfully slow. So you probably want to set this value considerably higher, between 10,000 and 100,000 rows. You may have to try a few different values to determine what works best in your environment. &lt;/p&gt;  &lt;p&gt;Now that you have the OLE DB Destination set up to commit multiple, smaller batches instead of one huge batch, you can enable error redirection. However, it will still redirect the entire batch of records that contain an error, not just the individual rows in error. For example, if you defined a batch size of 10,000 rows, and one row in the 10,000 row batch has an error, they will all be redirected to the error output. So how do you set it up to get all the good rows inserted, and get down to just the rows in error? We really want it to work on single row batches for error handling purposes, but as pointed out earlier, that can be very slow.&lt;/p&gt;  &lt;p&gt;There is an approach that allows you to get the best of both worlds - single row error handling with good performance. It involves staging the inserts through multiple OLE DB Destinations, each with smaller batch sizes. The last one in the process should have a commit size of 1, so that you get single rows on error redirection.&lt;/p&gt;  &lt;p&gt;To illustrate this technique, I've created a sample project. It has a few external dependencies that need to be set up before it will run. You need a database with three tables in it. One is a Numbers table, which are incredibly useful for quickly generating sample data. If you don't have one, please take a look at this &lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/you-require-a-numbers-table.aspx"&gt;post from Adam Machanic&lt;/a&gt; to see why you need one. The second table is used to test inserting data into a table with constraints.&lt;/p&gt;  &lt;div&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[SampleTable](&lt;/pre&gt;

    &lt;pre class="alteven"&gt;    [SampleTableID] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [Name] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](50) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alteven"&gt;    [Description] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](250) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [CheckValue] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alteven"&gt; &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [PK_SampleTable] &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;([SampleTableID] &lt;span class="kwrd"&gt;ASC&lt;/span&gt; )) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[SampleTable]  &lt;span class="kwrd"&gt;WITH&lt;/span&gt; &lt;span class="kwrd"&gt;CHECK&lt;/span&gt; &lt;span class="kwrd"&gt;ADD&lt;/span&gt;  &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; [CK_SampleTable] &lt;span class="kwrd"&gt;CHECK&lt;/span&gt;  (([CheckValue]&amp;gt;=(0) &lt;span class="kwrd"&gt;AND&lt;/span&gt; [CheckValue]&amp;lt;=(9)))&lt;/pre&gt;

    &lt;pre class="alt"&gt;GO&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;p&gt;The third table is a duplicate of the second table, but with no constraints. This table is used to catch the error rows.&lt;/p&gt;

&lt;div&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[SampleTableError](&lt;/pre&gt;

    &lt;pre class="alteven"&gt;    [SampleTableID] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [Name] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](50) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alteven"&gt;    [Description] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](250) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [CheckValue] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;NULL&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alteven"&gt;) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;

    &lt;pre class="alt"&gt;GO&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The package control flow truncates the destination table (SampleTable), and then runs a data flow.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image_3.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" alt="image" src="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image_thumb_3.png" width="174" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The data flow consists of a source that generates 5000 rows of data, with two of the rows violating constraints on the destination table. The OLE DB Source is connected to a OLE DB Destination that is pointed to the SampleTable, with a Maximum Insert Commit Size set to 1000 rows. The error output is connected to a second OLE DB Destination, that inserts into the same table (SampleTable). The second destination has it's Maximum Insert Commit Size set to 1. Finally, the error output from that OLE DB Destination is connected to a third one, which inserts the error rows into SampleTableError.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image_4.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="404" alt="image" src="http://www.agilebi.com/images/ErrorRedirectionwiththeOLEDBDestination_11A70/image_thumb_4.png" width="230" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The first OLE DB Destination attempts to insert a batch, giving us good performance. If the batch is successful, it moves on to the next batch. This keeps the inserts happening quickly. However, if the batch has one or more error rows, the entire batch is redirected to the second OLE DB Destination. This one inserts rows one at a time, giving us the single row error handling that we wanted. Good rows are inserted, but the error rows are redirected to the third OLE DB Destination to be written to an error table. It doesn't have to be an OLE DB Destination to handle the error rows, you could use a Flat File Destination or a script component to process them.&lt;/p&gt;

&lt;p&gt;You can modify this technique by using additional stages of OLE DB Destinations (for example, to go from 50,000 rows to 10,000 to 1) but I try not to go beyond three levels to keep things understandable. Your needs may vary, depending on the performance and number of rows you are processing.&lt;/p&gt;

&lt;p&gt;I've uploaded &lt;a href="http://cid-695cdda853ce07ee.skydrive.live.com/self.aspx/Public/BI%20Thoughts%20and%20Theories/OLEDBDestinationErrorRedirection.zip"&gt;the sample package to my SkyDrive&lt;/a&gt;. This one is done with SSIS 2008, but the same technique works in 2005.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=210" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /><category term="Error Handling" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Error+Handling/default.aspx" /><category term="SSIS 2008" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS+2008/default.aspx" /></entry><entry><title>ssisUnit 1.0 Is Available</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/08/31/ssisunit-1-0-is-available.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/08/31/ssisunit-1-0-is-available.aspx</id><published>2008-08-31T16:51:39Z</published><updated>2008-08-31T16:51:39Z</updated><content type="html">&lt;p&gt;The 1.0 bits for ssisUnit are now on &lt;a href="http://www.codeplex.com/ssisunit"&gt;CodePlex&lt;/a&gt;. The &lt;a href="http://www.codeplex.com/ssisUnit/Release/ProjectReleases.aspx?ReleaseId=12606"&gt;Release&lt;/a&gt; page for it includes versions for SQL Server 2005 and 2008.&lt;/p&gt;  &lt;p&gt;The biggest feature in this release is a GUI for creating the unit tests. The test files are still XML, but the GUI abstracts away a lot of the detail involved in creating a test. A couple of things to be aware of with the GUI, however:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It does not check to see if your test suite has been saved before closing. So remember, &amp;quot;Save Early, Save Often&amp;quot; :) &lt;/li&gt;    &lt;li&gt;It's possible (even likely) that you will see some errors while using the GUI. Being the most recently developed part of ssisUnit, it's had the least testing. So if you see an error, please open an issue on &lt;a href="http://www.codeplex.com/ssisUnit/WorkItem/List.aspx"&gt;CodePlex&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you are reading this, and wondering why anyone would want to unit test an SSIS package, please check out the TechEd Online presentation I posted about recently, &lt;a href="http://agilebi.com/cs/blogs/jwelch/archive/2008/08/19/testing-the-sql-database-at-teched.aspx"&gt;Testing the SQL Database&lt;/a&gt;. You might also consider attending the Unit Testing an SSIS Package session at the &lt;a href="http://www.vconferenceonline.com/business-intelligence/"&gt;SSWUG BI Virtual Conference&lt;/a&gt;. I'll be covering the basics of unit testing SSIS packages, and an overview of using ssisUnit to automate the process.&lt;/p&gt;  &lt;p&gt;If you are reading this, and wondering why unit test at all, I highly encourage you to check out &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FTest-Driven-Development-Addison-Wesley-Signature%2Fdp%2F0321146530%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1220201287%26sr%3D8-1&amp;amp;tag=ag05c-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;Test Driven Development, By Kent Beck&lt;/a&gt;. Not a traditional read for database developers, but it will give you a completely different take on the importance and benefits of unit testing.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=206" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author></entry><entry><title>Configuration Approaches In SSIS</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/08/31/configuration-approaches-in-ssis.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/08/31/configuration-approaches-in-ssis.aspx</id><published>2008-08-31T00:46:19Z</published><updated>2008-08-31T00:46:19Z</updated><content type="html">&lt;p&gt;A number of the SSIS MVPs were asked to contribute a white paper to MSDN a few months ago, and those articles were published recently. You'll notice a common thread in most of the topics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc671624.aspx"&gt;Considerations for High Volume ETL Using SQL Server Integration Services&lt;/a&gt; by Pat Martin &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc671619.aspx"&gt;Reusing Connections with Data Sources and Configurations&lt;/a&gt; by Matthew Roche &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc671625.aspx"&gt;Defining a Configuration Approach for Integration Services Packages&lt;/a&gt; by John Welch &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc671628.aspx"&gt;Best Practices for Integration Services Configurations&lt;/a&gt; by Jamie Thomson &lt;/li&gt;    &lt;li&gt;Understanding Integration Services Package Configurations by Rafael Salas (coming soon) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;They are all great articles, and well worth reading. &lt;/p&gt;  &lt;p&gt;Judging by the volume of questions related to configurations on the MSDN Forums, they are one of the more confusing features of SSIS. While there is some overlap in the articles on configurations, there's valuable information that is unique to each, and will help give you a more rounded view of how to use them. As there are a lot of options and tradeoffs with configurations, it's no surprise that everyone uses them slightly differently. &lt;/p&gt;  &lt;p&gt;I hope the articles are valuable. Please leave comments if you have an approach to configurations that works well for you.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=205" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /><category term="Configurations" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Configurations/default.aspx" /></entry><entry><title>Testing the SQL Database at TechED</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/08/19/testing-the-sql-database-at-teched.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/08/19/testing-the-sql-database-at-teched.aspx</id><published>2008-08-19T03:18:24Z</published><updated>2008-08-19T03:18:24Z</updated><content type="html">&lt;p&gt;While at TechEd this summer, I participated in a panel discussion on testing the database and related technologies. The panel also included Gert Drapers and Jamie Laflen of the Visual Studio Team System - Database Edition team, David Reed (who manages the SQL Server community samples on &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;), and Adam Machanic as the moderator. The discussion covered some of the pros and cons of testing data, and some of the common issues encountered. It was also a chance to talk about testing related areas (&lt;a href="http://www.codeplex.com/ssisunit"&gt;like SSIS packages&lt;/a&gt;), of which I am a big fan. If you are interested in seeing it, &lt;a href="http://msdn.microsoft.com/en-us/events/teched/cc676818.aspx"&gt;it was just put online&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you are interested in unit testing SSIS packages, keep an eye on &lt;a href="http://www.codeplex.com/ssisunit"&gt;www.codeplex.com/ssisunit&lt;/a&gt;. I should have a new release going up soon, which adds some much needed features, and a much more extensible framework for adding new functionality.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=203" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SQL Server" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SQL+Server/default.aspx" /><category term="Unit Testing" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Unit+Testing/default.aspx" /></entry><entry><title>Using the XML Task to Run an XPath Query</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/07/23/using-the-xml-task-to-run-an-xpath-query.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/07/23/using-the-xml-task-to-run-an-xpath-query.aspx</id><published>2008-07-23T01:19:20Z</published><updated>2008-07-23T01:19:20Z</updated><content type="html">&lt;p&gt;I came across a question about this the other day, and thought I'd share the answer here, as there doesn't seem to be much information out there about it.&amp;#160; The questioner wanted to know how to read a portion of an XML document into a variable. Fortunately, the XML Task allows you to do this by running an XPath query. To configure the task, follow these steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Set the operation type to XPATH. &lt;/li&gt;    &lt;li&gt;Specify a source for the XML (file, variable, or directly input). &lt;/li&gt;    &lt;li&gt;Set the OperationResult to save the results in a variable. &lt;/li&gt;    &lt;li&gt;Set the SecondOperandType to Direct Input. &lt;/li&gt;    &lt;li&gt;Specify the XPath query in the SecondOperand. &lt;/li&gt;    &lt;li&gt;Set the PutResultInOneNode option to False. &lt;/li&gt;    &lt;li&gt;Set the XPathOperation to Node list. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/UsingtheXMLTasktoRunanXPathQuery_901C/image.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="637" alt="image" src="http://www.agilebi.com/images/UsingtheXMLTasktoRunanXPathQuery_901C/image_thumb.png" width="754" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If, after configuring this, the variable is empty, it's likely that the XPath isn't correct. This can be caused by a number of things. A good way to test your XPath is this web page: &lt;a title="http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm" href="http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm"&gt;http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm&lt;/a&gt; It allows you to upload your XML file, and then run your XPath query against it.&lt;/p&gt;  &lt;p&gt;Another common problem occurs when the XML file uses namespaces. If it does, you can try using XPath like this: //*[local-name()='Setup' and&amp;#160; namespace-uri()='&lt;strong&gt;http://test.org'&lt;/strong&gt;]&lt;/p&gt;  &lt;p&gt;Hopefully this helps, if you are working with XPath in SSIS.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=198" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /><category term="XML" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/XML/default.aspx" /></entry><entry><title>Presenting at the SSWUG Virtual BI Conference</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/07/20/presenting-at-the-sswug-virtual-bi-conference.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/07/20/presenting-at-the-sswug-virtual-bi-conference.aspx</id><published>2008-07-20T21:28:37Z</published><updated>2008-07-20T21:28:37Z</updated><content type="html">&lt;p&gt;I'm going to be presenting a few sessions at the upcoming &lt;a href="http://www.vconferenceonline.com/business-intelligence/"&gt;SSWUG Virtual Business Intelligence Conference&lt;/a&gt;. It's occurring from September 24-26, 2008. It has a very impressive &lt;a href="http://www.vconferenceonline.com/business-intelligence/speakers.asp"&gt;list of speakers&lt;/a&gt; (I'm really not sure how I made it on the list - it's quite an honor). I'll be presenting on configurations in SSIS, unit testing SSIS (one of my favorite topics), and the new Report Builder functionality in SQL Server 2008.&lt;/p&gt;  &lt;p&gt;I'm looking forward to it, but it will be a new experience for me. The sessions will be recorded in advance, and then the speakers will be online during their presentation time slot to answer questions from the audience. It sounds interesting, and since it's being broadcast online, there's potential for a much wider range of attendees.&lt;/p&gt;  &lt;p&gt;If you're interested in the conference, please check out the &lt;a href="http://www.vconferenceonline.com/Business-Intelligence/"&gt;web site&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=197" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /><category term="Unit Testing" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Unit+Testing/default.aspx" /></entry><entry><title>Presenting at Midlands PASS</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/07/17/presenting-at-midlands-pass.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/07/17/presenting-at-midlands-pass.aspx</id><published>2008-07-17T03:15:36Z</published><updated>2008-07-17T03:15:36Z</updated><content type="html">&lt;p&gt;I'm presenting at the &lt;a href="http://www.truthsolutions.com/midlandspass/"&gt;Midlands PASS&lt;/a&gt; chapter in Columbia, SC tomorrow night, July 17th. I'll be presenting on SSIS configurations and some common approaches for implementing them. Configurations are one of the best features about SSIS, but also one of the most confusing. If you're in the area, and would like to learn more, please stop by.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=196" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="Configurations" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Configurations/default.aspx" /></entry><entry><title>Continuing a Loop After an Error</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/06/29/continuing-a-loop-after-an-error.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/06/29/continuing-a-loop-after-an-error.aspx</id><published>2008-06-29T00:32:56Z</published><updated>2008-06-29T00:32:56Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;A common question on the &lt;a href="http://forums.microsoft.com/Forums/ShowForum.aspx?ForumID=80&amp;amp;SiteID=1"&gt;SSIS forums&lt;/a&gt; is how to continue a loop after an error occurs. For example, you might have a For Each Loop container that iterates through a set of files in a folder. If one file is invalid, you want to continue processing the remaining files. Fortunately, there is a simple pattern that allows this to be accomplished.&lt;/p&gt;  &lt;p&gt;I created a package to illustrate this. Basically, the package implements the scenario above. It consists of a For Each Loop to iterate through all the files in a folder. There is a data flow task that processes each input file, and runs it through a row count (just for illustration purposes). The Script task is there to illustrate an error handling task could be attached to the data flow, but it’s empty in the example package. It would need to be replaced with the appropriate task to handle a failure, such as a File System task to move the file to another folder.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="290" alt="image" src="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_thumb.png" width="270" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The key to handling the errors is the Sequence container, or more specifically, how the Sequence container is set up. The OnError event handler for the Sequence container has been enabled. You can do this by selecting the Sequence container, then clicking the Event Handlers tab. Select the OnError event in the drop down, then click the link in the designer to create an empty event handler. It’s not necessary to add anything to event handler.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_3.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="140" alt="image" src="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_thumb_3.png" width="519" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once it has been created, go to the Variables window, and select the option to show System variables. Select the Propagate variable, and set the value to FALSE. This prevents any errors occurring on tasks inside the Sequence container from being raised to the For Each loop.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_4.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="227" alt="image" src="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_thumb_4.png" width="394" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is all that really needs to be done, but if you run the package with only this set, you’ll notice that the Data Flow task and the Sequence container both report an error. To prevent the Sequence Container from reporting an error, set the MaximumErrorCount property of the container to 0.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_5.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="231" alt="image" src="http://www.agilebi.com/images/ContinuingaLoopAfteranError_9159/image_thumb_5.png" width="286" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that you do not have to use a sequence container to accomplish this. You could make the same settings on individual tasks inside the For Each loop. However, the Sequence container gives you a common place to make the settings, and you can have as many tasks inside it as you’d like.&lt;/p&gt;  &lt;p&gt;The example package is &lt;a href="http://cid-695cdda853ce07ee.skydrive.live.com/self.aspx/Public/BI%20Thoughts%20and%20Theories/ContinueLoop.zip"&gt;posted on my Skydrive&lt;/a&gt;. The zip file contains a folder call Import. The package expects this folder to be located in C:\Temp. It contains 4 text files for the package to process. The 2nd file contains an error (one of the rows has fewer columns than it is supposed to), so that you can see the error behavior.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=194" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="Examples" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Examples/default.aspx" /><category term="SSIS" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx" /></entry><entry><title>Configuration Changes in SSIS 2008</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/06/20/configuration-changes-in-ssis-2008.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/06/20/configuration-changes-in-ssis-2008.aspx</id><published>2008-06-20T21:36:51Z</published><updated>2008-06-20T21:36:51Z</updated><content type="html">&lt;p&gt;In a previous post, I detailed &lt;a href="http://agilebi.com/cs/blogs/jwelch/archive/2007/12/04/fun-with-ssis-configurations.aspx"&gt;some of the challenges&lt;/a&gt; that I had encountered when trying to modify the connection string used for SQL Server configurations from the command line. In SSIS 2005, command line options were applied after the configurations were loaded (with the exception of parent package variables). Effectively, this meant that you could not change the location a configuration pointed to from the command line.&lt;/p&gt;  &lt;p&gt;This has been changed in SSIS 2008. Configurations are now loaded twice, once when the package is originally loaded, and then again after any command line options are applied. The order of events is:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The package file is loaded.&lt;/li&gt;    &lt;li&gt;The configurations specified in the package at design time are applied in the order specified in the package (except for Parent Package Variables).&lt;/li&gt;    &lt;li&gt;Command line values are applied.&lt;/li&gt;    &lt;li&gt;The configurations specified in the package at design time are reloaded in the order specified in the package (except for Parent Package Variables). The configurations will use any updated values from the command line when they are reloaded, so it is possible to change the connection string for a SQL Server configuration.&lt;/li&gt;    &lt;li&gt;Parent Package Variable Configurations are applied.&lt;/li&gt;    &lt;li&gt;The package is run.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This is a nice improvement, since you can now set up a package with SQL Server configurations, and point the package to the correct database are runtime by simply using the /CONN switch of DTEXEC. However, it still isn’t perfect . Since the design time configuration is applied twice, a value that you apply using /SET on the command line can be overridden by a preexisting configuration. &lt;/p&gt;  &lt;p&gt;If you’d like to see this behavior, I’ve provided a simple package. The package has a single variable (“TestVar”) defined. It has an XML configuration enabled that sets the value of TestVar to “Dev”. There is a single Script Task that fires an information event that contains the value of the variable.&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; fireAgain = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            Variables vars = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            Dts.VariableDispenser.LockOneForRead(&lt;span style="color:#006080;"&gt;&amp;quot;TestVar&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; vars);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            Dts.Events.FireInformation(0, &lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Value is: &amp;quot;&lt;/span&gt; + vars[&lt;span style="color:#006080;"&gt;&amp;quot;TestVar&amp;quot;&lt;/span&gt;].Value, &lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, 0, &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; fireAgain);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            vars.Unlock();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            Dts.TaskResult = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)ScriptResults.Success;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If I run this package using this command: &lt;/p&gt;

&lt;p&gt;dtexec /file Configuration_Overwrite.dtsx /SET \Package.Variables[User::TestVar].Properties[Value];Prod /REP EWI&lt;/p&gt;

&lt;p&gt;I’d expect to see the value “Prod” reported in the output. Instead, “Dev” is displayed. If you disable the package configurations and re-run it using the same command, it does report “Prod”.&lt;/p&gt;

&lt;p&gt;Overall, I prefer the new behavior, but it does introduce a new issue to be aware of. In general, you need to be careful to not /SET a value that is also specified in a configuration, as it will be overwritten. I’ve filed a &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=352228"&gt;Connect suggestion&lt;/a&gt; for the addition of /SetBefore and /SetAfter switches to DTEXEC, so that you can explicitly define when you want the /SET applied. If you think it’s a good idea, &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=352228"&gt;please vote for it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://cid-695cdda853ce07ee.skydrive.live.com/self.aspx/Public/BI%20Thoughts%20and%20Theories/Configuration|_Overwrite.zip"&gt;sample package is on my SkyDrive&lt;/a&gt;. You may need to update the location of the XML configuration, but it has no other dependencies.&lt;/p&gt;

&lt;p&gt;Thanks to Cho Yeung on the SSIS team for clarifying the load order when the package is executed.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=189" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="SSIS 2008" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS+2008/default.aspx" /><category term="Configurations" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Configurations/default.aspx" /></entry><entry><title>Mariner Wins Microsoft Performance Management Partner of the Year</title><link rel="alternate" type="text/html" href="http://agilebi.com/cs/blogs/jwelch/archive/2008/06/19/mariner-wins-microsoft-performance-management-partner-of-the-year.aspx" /><id>http://agilebi.com/cs/blogs/jwelch/archive/2008/06/19/mariner-wins-microsoft-performance-management-partner-of-the-year.aspx</id><published>2008-06-19T04:52:21Z</published><updated>2008-06-19T04:52:21Z</updated><content type="html">&lt;p&gt;This is really cool – &lt;a href="http://www.mariner-usa.com/"&gt;Mariner&lt;/a&gt; (my employer) was awarded the &lt;a href="http://www.microsoft.com/Presspass/press/2008/jun08/06-16POTYFinalistsPR.mspx"&gt;Microsoft Performance Management Partner of the Year&lt;/a&gt; award this year, based on a solution that we created for the Charlotte-Mecklenburg Schools (CMS) system. When I was first told about the award, I asked, “It’s for the Southeast region, right?”. The answer: “No, think bigger.” “The US? Very cool!” “No, bigger than that.” Yes, it’s the Worldwide Performance Management Partner of the Year – selected from over 2000 entries. &lt;/p&gt;  &lt;p&gt;So what is this award winning solution? It’s a performance management system that allows school systems to track how well they are progressing on their long term goals for improving the learning environments in schools. This was an interesting solution to work on – most of my experience has been in applying business intelligence to more traditional business solutions. While there are some similarities, the core focus is very different. Success for a school system isn’t judged on profits, it’s based on how well the children are educated. Since I have one child already in the CMS system, and another one going in soon, there was much more of a personal impact from seeing what they were doing, and their approach to meeting their goals.&lt;/p&gt;  &lt;p&gt;It was also interesting from a technology standpoint. The technology for the solution involves most of Microsoft’s BI stack – SQL Server for the data repository, SSIS for the data integration, SSAS for analysis, SSRS for some reporting, and Sharepoint + PerformancePoint Server for the front-end display of the analytic information. It’s pretty impressive seeing how Microsoft’s BI story has really come together over the last couple of years, and actually getting the chance to put all these pieces in action with each other was great (and challenging in a few spots :) ). The team that did the development work did a great job with it, and it really shows in the end product.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=188" width="1" height="1"&gt;</content><author><name>jwelch</name><uri>http://agilebi.com/cs/members/jwelch.aspx</uri></author><category term="Misc" scheme="http://agilebi.com/cs/blogs/jwelch/archive/tags/Misc/default.aspx" /></entry></feed>