<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://agilebi.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Agile BI Community</title><link>http://agilebi.com/cs/blogs/default.aspx</link><description>Community site for agile business intelligence developers</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>SQL Server 2005 Installation Failures</title><link>http://agilebi.com/cs/blogs/mcole/archive/2010/06/24/sql-server-2005-installation-failures.aspx</link><pubDate>Thu, 24 Jun 2010 16:38:51 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:465</guid><dc:creator>mcole</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Recently I was trying to install SQL Server 2005 on a workstation running Windows XP Professional SP3 and for some reason the installation kept failing. The first item in the list that failed was MSXML 6.0. After combing through the log file I found the following message: &amp;quot;Product: MSXML 6 Service Pack 2 (KB954459) -- Configuration failed.&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/mcole/clip_image001_4F8AF089.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image001" border="0" alt="clip_image001" src="http://agilebi.com/cs/blogs/mcole/clip_image001_thumb_1E3C0629.jpg" width="244" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;According to &lt;a href="http://support.microsoft.com/kb/968749"&gt;http://support.microsoft.com/kb/968749&lt;/a&gt;, when SQL Server Setup tries to install MSXML 6.0 SP2, it detects that the version of MSXML 6.0 that is described in Knowledge Base article 954459 is already installed on the computer. Therefore, the validation process indicates that the current version of MSXML 6.0 should not be replaced. This stops the installation of both MSXML 6.0 and SQL Server 2005.&lt;/p&gt;  &lt;p&gt;To work around this issue, use the Windows Installer CleanUp utility to remove references to MSXML 6.0 Service Pack 2. The Windows Installer CleanUp utility can be downloaded here: &lt;a href="https://red001.mail.microsoftonline.com/kb/290301"&gt;http://support.microsoft.com/kb/290301&lt;/a&gt;. Once installed, simply run the utility, select MSXML6 Service Pack 2 (KB954459) [6.20.1099.0] in the list and click Remove. After MSXML 6.0 has been removed then you should be able to install SQL Server 2005 without any further problems.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/mcole/clip_image002_3B61AE33.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image002" border="0" alt="clip_image002" src="http://agilebi.com/cs/blogs/mcole/clip_image002_thumb_742BE233.jpg" width="237" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=465" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Configuration+Failed/default.aspx">Configuration Failed</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/MSXML/default.aspx">MSXML</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Setup/default.aspx">Setup</category></item><item><title>Moving SSIS Packages with ADO.NET Destinations Between 2008 R2 and 2008</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/05/13/moving-ssis-packages-with-ado-net-destinations-between-2008-r2-and-2008.aspx</link><pubDate>Thu, 13 May 2010 22:19:33 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:443</guid><dc:creator>jwelch</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;As noted by &lt;a href="http://blogs.msdn.com/mattm/default.aspx"&gt;Matt Masson&lt;/a&gt; from the Integration Services team, &lt;a href="http://blogs.msdn.com/mattm/archive/2009/11/12/something-new-for-ssis-in-sql-server-2008-r2-november-ctp.aspx"&gt;not much has changed&lt;/a&gt; in SSIS 2008 R2. In fact, R2 is pretty much identical, with the exception of the ADO.NET Destination. So if you are developing packages, you can build them using the 2008 or 2008 R2 version of BIDS, and they can be used in either environment successfully, &lt;strong&gt;as long as the package doesn’t have an ADO.NET Destination&lt;/strong&gt;. If it does, a package developed in the 2008 R2 version of BIDS will give errors when you open on a machine with the 2008 version of SSIS installed. This is because the 2008 version of the ADO.NET Destination doesn’t know what to do with the new property added to the R2 version.&lt;/p&gt;  &lt;p&gt;This wouldn’t be a big deal, if you could have side-by-side installs of BIDS 2008 and BIDS 2008 R2, but the install for R2 replaces the 2008 version of BIDS. So, if you need to move packages developed in 2008 R2 to 2008 (a common scenario for me), you have to do a little extra work. There are a few values that need to be removed or changed by directly editing the package XML.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;As always, it’s a good idea to make a backup of your package before editing the XML directly.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Open the package in your favorite text or XML editor, and look for the section that contains &amp;lt;components&amp;gt;. Underneath that, you need to locate the &amp;lt;component&amp;gt; tag that relates to your ADO NET Destination (the sample below is easy, since the name is “ADO NET Destination”, but that’s not the typical case (you do give your components meaningful names, right?).&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;component &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;16&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ADO NET Destination&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;componentClassID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{2E42D45B-F83C-400F-8D77-61DDE6A7DF29}&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Writes to a database using ADO.NET provider.&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;localeId&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;-1&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;usesDispositions&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;validateExternalMetadata&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;pipelineVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;contactInfo&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Writes to a database using ADO.NET provider.;Microsoft Corporation; Microsoft SqlServer v10; © 2007 Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;properties&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;23&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;TableOrViewName&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;The Destination database table name.&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Microsoft.DataTransformationServices.Controls.ModalMultilineStringEditor, Microsoft.DataTransformationServices.Controls, Version= 10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Notify&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&amp;quot;sample&amp;quot;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;24&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;BatchSize&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Int32&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Specify the number of rows per batch. The default is 0 which uses the same size as SSIS internal buffer. &lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Notify&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;25&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;CommandTimeout&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Int32&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;The number of seconds before a command times out. A value of 0 indicates infinite time-out. &lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Notify&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;30&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;26&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UseBulkInsertWhenPossible&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Boolean&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Specifies whether to use the SqlBulkCopy interface to improve the performance of bulk insert operations. Only certain providers support this interface.&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Notify&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;27&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UserComponentTypeName&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;None&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft.SqlServer.Dts.Pipeline.ADONETDestination, Microsoft.SqlServer.ADONETDest, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;properties&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;

&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Once you’ve located the right &amp;lt;component&amp;gt; tag, you need to make two changes:&lt;/p&gt;

&lt;p&gt;One, change the version=”1” attribute in the &amp;lt;component&amp;gt; tag to version=”0”.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;component &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;16&lt;/span&gt;&amp;quot;
           &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ADO NET Destination&lt;/span&gt;&amp;quot;
           &lt;span style="color:red;"&gt;componentClassID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{2E42D45B-F83C-400F-8D77-61DDE6A7DF29}&lt;/span&gt;&amp;quot;
           &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Writes to a database using ADO.NET provider.&lt;/span&gt;&amp;quot;
           &lt;span style="color:red;"&gt;localeId&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;-1&lt;/span&gt;&amp;quot;
           &lt;span style="color:red;"&gt;usesDispositions&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot; 
           &lt;span style="color:red;"&gt;validateExternalMetadata&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot; 
           &lt;span style="background-color:yellow;"&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;font color="#0000ff"&gt;0&lt;/font&gt;&amp;quot;&lt;/span&gt; 
           &lt;span style="color:red;"&gt;pipelineVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;0&lt;/span&gt;&amp;quot; 
           &lt;span style="color:red;"&gt;contactInfo&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Writes to a database using ADO.NET provider.;Microsoft Corporation; Microsoft SqlServer v10; © 2007 Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Second, remove the entire &amp;lt;property name=”UseBulkInsertWhenPossible&amp;gt; element. You can comment it out, as shown below, or just delete it.&lt;/p&gt;

&lt;pre class="code"&gt;    &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;25&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;CommandTimeout&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Int32&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;The number of seconds before a command times out. A value of 0 indicates infinite time-out. &lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Notify&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;30&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;lt;property id=&amp;quot;26&amp;quot; name=&amp;quot;UseBulkInsertWhenPossible&amp;quot; dataType=&amp;quot;System.Boolean&amp;quot; state=&amp;quot;default&amp;quot; isArray=&amp;quot;false&amp;quot; description=&amp;quot;Specifies whether to use the SqlBulkCopy interface to improve the performance of bulk insert operations. Only certain providers support this interface.&amp;quot; typeConverter=&amp;quot;&amp;quot; UITypeEditor=&amp;quot;&amp;quot; containsID=&amp;quot;false&amp;quot; expressionType=&amp;quot;Notify&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;27&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UserComponentTypeName&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;dataType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;state&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;default&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;isArray&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;typeConverter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;UITypeEditor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot; &lt;span style="color:red;"&gt;containsID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;expressionType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;None&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft.SqlServer.Dts.Pipeline.ADONETDestination, Microsoft.SqlServer.ADONETDest, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;

&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;If you have a lot of packages to move back and forth, you probably don’t want to hand edit this each time. I wrote a little application that will process a folder of .dtsx files, and strip the 2008 R2 information out. This is done using an XSLT transform (available in the source code). The &lt;a href="http://cid-71c6f14e3c205217.skydrive.live.com/browse.aspx/Public/Moving%20SSIS%202008%20R2%20to%202008?uc=1&amp;amp;isFromRichUpload=1"&gt;application and source&lt;/a&gt; are available to download from my SkyDrive.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=443" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS+2008/default.aspx">SSIS 2008</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS+2008+R2/default.aspx">SSIS 2008 R2</category></item><item><title>How to Save Yourself From Yourself</title><link>http://agilebi.com/cs/blogs/musings_on_etl/archive/2010/05/13/how-to-save-yourself-from-yourself.aspx</link><pubDate>Thu, 13 May 2010 14:12:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:442</guid><dc:creator>JJames</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Have you ever wished there was some sort of magic “undo” button for something that you just did? Maybe you &lt;i&gt;didn’t&lt;/i&gt; really mean to delete all 10 million records out of your table. You just forgot a little thing called a constraint. Such was the case with one of my co-workers recently. He accidentally deleted all of the tables out of the database. On the bright side though, it did give us the ability to test our disaster recovery plan!&lt;/p&gt;  &lt;p&gt;To make sure that you don’t have to unwillingly test your disaster recovery plan, there is one easy setting to change in SSMS that will (hopefully) prevent you from making such a mistake.&lt;/p&gt;  &lt;p&gt;A co-worker (other than the one who deleted the tables inadvertently) showed this feature of SSMS one day in a weekly code review that we have.&lt;/p&gt;  &lt;p&gt;SSMS provides you information in the status bar regarding the server to which you are currently connected. The only bad thing about this is that no matter what server you connect to, there is no real POP of anything to differentiate between environments. You have to physically look down and see what server you are connected to. See the picture below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/Normal_33EB9132.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/Normal_thumb_2B1B88E6.png" style="border:0px none;display:inline;" title="Normal" alt="Normal" border="0" height="441" width="575"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In my job, I connect to Localhost, a Sandbox environment, and a QA environment. It would be nice to have the ability to, at a quick glance (ideally out of peripheral vision), be able to tell to which server I’m currently connected. To accomplish this, follow the steps below.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In the Object Explorer pane, click Connect ---&amp;gt; Database Engine&lt;/li&gt;    &lt;li&gt;Click Options. The Connection Properties tab is now selected.&lt;/li&gt;    &lt;li&gt;Check Use custom color, then click Select to choose your custom color.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;As a rule of thumb, I use Green for Localhost and Red for anything else (&lt;b&gt;&lt;font color="#00ff00"&gt;Green = Good&lt;/font&gt;&lt;/b&gt;; &lt;b&gt;&lt;font color="#ff0000"&gt;Red = CAREFUL!!&lt;/font&gt;&lt;/b&gt;)&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/Options_5C3AC386.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/Options_thumb_4F606D68.png" style="border:0px none;display:inline;" title="Options" alt="Options" border="0" height="427" width="367"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now, connect to a new instance of your SQL Server, and open a new query window. Notice the status bar at the bottom of the screen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/Green_4D436E9F.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/Green_thumb_454BCC3D.png" style="border:0px none;display:inline;" title="Green" alt="Green" border="0" height="482" width="612"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And, the nice thing is that these preferences are saved until you change them, even if SQL Management Studio is closed. So, as has been famously coined before, “Set it and forget it!!” Hopefully this little trick will save you from yourself. I know that it’s saved me a time or two!&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=442" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/Personal+Experience/default.aspx">Personal Experience</category></item><item><title>Inconsistent Column Width in SSRS</title><link>http://agilebi.com/cs/blogs/musings_on_etl/archive/2010/05/12/inconsistent-column-width-in-ssrs.aspx</link><pubDate>Wed, 12 May 2010 20:02:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:440</guid><dc:creator>JJames</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The issue I ran into was this: I was in Design mode of a report that I was developing. No matter what I did to change the column width on my columns, in both Preview as well as when I published my report, the column widths were &lt;i&gt;still&lt;/i&gt; off. FRUSTRATING!!&lt;/p&gt;  &lt;p&gt;After Googling for a couple of days, and coming across some not-so-helpful answers, I finally decided to try one more thing. Being fairly new to SSRS, I decided to search to see what the difference was between a Matrix and a Table. I came across the following definition from &lt;a href="http://technet.microsoft.com/en-us/library/ms157334.aspx" target="_blank"&gt;BOL&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;“Use a matrix to display grouped data and summary information. You can group data by multiple fields or expressions in row and column groups. Matrices provide functionality similar to crosstabs and pivot tables. At run time, as the report data and data regions are combined, a matrix grows horizontally and vertically on the page.”&lt;/p&gt;  &lt;p&gt;In laymen’s terms, a Matrix is used if your report can have dynamic columns. If you don’t need that functionality, then a Table will suffice just fine.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;At Last!&lt;/i&gt; My last-ditch attempt to circumvent this most annoying problem. I did away with my layout having a Matrix as the root, and dropped a Table into Design mode instead, and started building my report. To my delight, I could size the columns &lt;i&gt;any way that I wanted to&lt;/i&gt;, and the formatting would stick!&lt;/p&gt;  &lt;p&gt;Bottom Line: If you &lt;i&gt;have&lt;/i&gt; to use a Matrix because of the reason mentioned above (dynamic columns), then formatting the layout of those columns is going to be a royal pain. If you can get away with using a Table instead, then do it. It will make your life so much easier.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=440" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/SSRS/default.aspx">SSRS</category><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/General+Annoyances/default.aspx">General Annoyances</category></item><item><title>Speaking at the Carolina Code Camp</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/05/12/speaking-at-the-carolina-code-camp.aspx</link><pubDate>Wed, 12 May 2010 15:34:47 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:437</guid><dc:creator>jwelch</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’ll be presenting a couple of sessions at the &lt;a href="http://codecamp.developersguild.org/Home/Overview"&gt;Carolina Code Camp&lt;/a&gt; on Saturday, May 15th. This will be my second time presenting at the Carolina Code Camp, and I’m looking forward to it. Last time, I had great audience participation, and the event was well organized and fun.&lt;/p&gt;  &lt;p&gt;I’ll be presenting on “Processing Flat Files with SSIS” at 8:45 AM and “Unit Testing SSIS Packages” at 12:30 PM. Looking forward to both – it should be fun.&lt;/p&gt;  &lt;p&gt;If you are in the area, feel free to drop in – there is no charge for the Code Camp.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=437" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>T-SQL Tuesday #006 – LOBs in the SSIS Dataflow</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/05/11/t-sql-tuesday-006-lobs-in-the-ssis-dataflow.aspx</link><pubDate>Tue, 11 May 2010 21:38:18 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:434</guid><dc:creator>jwelch</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;&lt;em&gt;The topic for &lt;/em&gt;&lt;em&gt;&lt;a href="http://sqlblog.com/blogs/michael_coles/archive/2010/05/03/t-sql-tuesday-006-what-about-blob.aspx"&gt;T-SQL Tuesday #006&lt;/a&gt; is LOB&lt;/em&gt; &lt;em&gt;data, selected by this month’s host, Michael Coles. If you aren’t familiar with T-SQL Tuesdays, Michael has a nice summary in his post.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In database terms, LOBs are Large OBjects, also referred to as BLOBS (Binary Large OBjects). These are data types that can exceed the maximum row size of 8 KB in SQL Server. Most often, they are used for storing large amounts of text or binary data in the database. An example of this would be an application that stores documents in a database table. SSIS has some special features for handling LOBs in the dataflow, and this post will provide an overview of them and provide a few tips on using them wisely, as well as some approaches to keep them from killing your data flow performance.&lt;/p&gt;  &lt;h2&gt;Data Types for LOBs&lt;/h2&gt;  &lt;p&gt;LOBs are represented by three types in SSIS: DT_TEXT, DT_NTEXT, and DT_IMAGE. These map to the SQL Server types VARCHAR(MAX), NVARCHAR(MAX), and VARBINARY(MAX). Each of these types can hold 2,147,483,647 bytes, or almost 2GB of data. Columns with these data types have some special rules. &lt;/p&gt;  &lt;p&gt;First, if you want to use them in a Derived Column expression, you’ll probably need to cast it to another type, like DT_STR or DT_WSTR, as the LOB types aren’t supported by most of the built-in functions. One thing to be careful of with this is that the entire contents of the LOB may not fit in the data type you are casting to, which will cause a truncation error. You can either set the Derived Column transformation to ignore truncation errors, or redirect error rows so you can handle the longer values differently.&lt;/p&gt;  &lt;p&gt;If you are accessing LOBs in a Script component, you have to use the AddBlobData(), GetBlobData(), and ResetBlobData() methods on the column to get to the data.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Input0_ProcessInputRow(&lt;span style="color:#2b91af;"&gt;Input0Buffer &lt;/span&gt;Row)
{
    System.Text.&lt;span style="color:#2b91af;"&gt;UnicodeEncoding &lt;/span&gt;encoding= &lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Text.&lt;span style="color:#2b91af;"&gt;UnicodeEncoding&lt;/span&gt;();

    Row.LOBNTEXT.AddBlobData(encoding.GetBytes(&lt;span style="color:#a31515;"&gt;&amp;quot;My Test String&amp;quot;&lt;/span&gt;));
    &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] bytes = Row.LOBNTEXT.GetBlobData(0, (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)Row.LOBNTEXT.Length);
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;myString = encoding.GetString(bytes);
}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Note that you should use the System.Text.AsciiEncoding class in the above code if you are working with non-Unicode data.&lt;/p&gt;

&lt;h2&gt;Transforms for LOB Data&lt;/h2&gt;

&lt;p&gt;There are two transformations in SSIS specifically designed for working with LOB data: Import Column and Export Column. The Import Column transformation is used to import the contents of a file from disk into a column in the data flow, as a LOB. The Export Column is used to do perform the reverse operation – that is, it saves the contents of a LOB column to a file on disk. Since you can process one file per row, these transformations can be really useful for moving multiple files in and out of a database.&lt;/p&gt;

&lt;p&gt;There’s a few good walkthroughs on using these transformations, so rather than reposting the same information, here’s a few links:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bimonkey.com/2009/09/the-import-column-transformation/"&gt;The Import Column Transformation, by James Beresford (aka BI Monkey)&lt;/a&gt;; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bimonkey.com/2009/06/the-export-column-transformation/"&gt;The Export Column Transformation, by James Beresford (aka BI Monkey)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/jwelch/archive/2008/02/02/importing-files-using-ssis.aspx"&gt;Importing Files Using SSIS, by me&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Performance&lt;/h2&gt;

&lt;p&gt;Because these data types have the potential to hold so much data, SSIS handles them a little differently than the standard data types. They are allocated separately from regular data in the buffers. When there is memory pressure, SSIS spools buffers to disk. The potential size of LOB data makes it very likely to be spooled, which can be a pretty major performance bottleneck. To minimize it, you want to make sure that the LOB data is being spooled to a nice, fast disk that doesn’t have a lot of contention. To control what disk they are spooled to, you can set the BLOBTempStoragePath property on the Data Flow task. Note that this is a different setting than BufferTempStoragePath, which controls where regular data is spooled. Ideally, you want to make sure each of these settings points to a different physical disk.&lt;/p&gt;

&lt;p&gt;The other item to consider is whether you actually need LOB data. In some scenarios, the LOB data types are used for convenience or because there is a possibility that a small percentage of the data would exceed the maximum length of a regular data type. If you are processing a lot of data with LOB types, and most of the LOB data is small enough to fit in an regular data type, then you may be better off using a two pass approach. In one pass, select only the data with LOB values small enough to fit in a standard data type, and cast it in the SELECT statement. SSIS will process this set of data using the normal buffer approach, which should be faster. Then, do a second pass where you select only the data that is too large for a regular data type. This will minimize the amount of data that has to be processed using LOB data types. To figure out the length of a LOB column in SQL Server, you can use the &lt;a href="http://msdn.microsoft.com/en-us/library/ms173486.aspx"&gt;DATALENGTH&lt;/a&gt; function.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:magenta;"&gt;DATALENGTH&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;MyLOBColumn&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;MyLOBTable&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;As usual with performance, your mileage may vary on this one. It’s worked well for me in a few scenarios, but there’s some overhead involved in using two passes. So, as with any performance tips, test it in your environment, with a solid representative sample of your data, before implementing it in production.&lt;/p&gt;

&lt;p&gt;There it is – a whirlwind tour of LOBs in SSIS. If you have any questions or comments, please post them.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=434" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/T-SQL+Tuesday/default.aspx">T-SQL Tuesday</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/LOBs/default.aspx">LOBs</category></item><item><title>Delete Multiple Connection Managers SSIS</title><link>http://agilebi.com/cs/blogs/musings_on_etl/archive/2010/04/22/delete-multiple-connection-managers-ssis.aspx</link><pubDate>Thu, 22 Apr 2010 17:23:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:430</guid><dc:creator>JJames</dc:creator><slash:comments>1</slash:comments><description>
&lt;p&gt;Have you ever wanted to save yourself some time by copying a package, renaming it, and then modifying its contents to suit your needs? What if the package that you are copying from has 60 connection managers, and your new package only needs 1? In SSIS, there is no ability to do a “select all” on the connection managers that you don’t need and delete them. So, we could go hand by hand and delete every single one by right-clicking it and clicking Delete.&lt;/p&gt;
  
&lt;p&gt;But where’s the fun in &lt;i&gt;that&lt;/i&gt;?! :) I asked one of my co-workers about this scenario, and he suggested editing the XML of the package directly, which was a GREAT idea! (I wish I would have thought of that myself)&lt;/p&gt;
  
&lt;p&gt;Here is how my Connection Managers pane appeared at first:&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/connectionmanagers_067EDBD7.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/connectionmanagers_thumb_3C342131.png" style="border-width:0px;display:inline;" title="connectionmanagers" alt="connectionmanagers" border="0" height="342" width="566"&gt;&lt;/a&gt; &lt;/p&gt;
  
&lt;p&gt;As you can see, it would have been pretty abysmal to delete everyone of these things by hand.&lt;/p&gt;
  
&lt;p&gt;If you wish to delete these connections en masse, follow the instructions below.&lt;/p&gt;
  
&lt;p&gt;1) Close your package if you currently have it open. &lt;/p&gt;
  
&lt;p&gt;2) Right-click on your package and click View Code.&amp;nbsp; This opens your package in XML mode. &lt;/p&gt;
  
&lt;p&gt;&amp;nbsp;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/menu_56B82FCC.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/menu_thumb_15A9B068.png" style="border:0px none;display:inline;" title="menu" alt="menu" border="0" height="541" width="237"&gt;&lt;/a&gt; &lt;/p&gt;
  
&lt;p&gt;3) Look for XML tags such as the one below (these blocks of code are the ones that you will want to delete): &lt;/p&gt;
  
&lt;pre&gt;&lt;pre style="margin:0em;width:14.21%;font-family:consolas,'Courier New',courier,monospace;height:14px;font-size:12px;"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DTS&lt;/span&gt;:&lt;span&gt;ConnectionManager&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font face="Trebuchet MS"&gt;a. This is part of the XML code for my connections:&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;

  
&lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/xml_3AC6FAD4.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/xml_thumb_2DECA4B6.png" style="border:0px none;display:inline;" title="xml" alt="xml" border="0" height="449" width="787"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;font face="trebu"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;All you need to do now is to delete the block of code associated with the Connection Managers that you wish to delete.&lt;/p&gt;

&lt;p&gt;That’s it! Now you don’t have to worry about wasting time trying to delete multiple Connection Managers one-by-one.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=430" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/XML/default.aspx">XML</category><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/SSIS/default.aspx">SSIS</category></item><item><title>Inconsistent Background Colors in SSRS 2008</title><link>http://agilebi.com/cs/blogs/musings_on_etl/archive/2010/04/21/inconsistent-background-colors-in-ssrs-2008.aspx</link><pubDate>Wed, 21 Apr 2010 18:12:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:428</guid><dc:creator>JJames</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I ran across this issue a while back and figured I’d blog about my findings. After running my issue through Google, it turns out that I wasn’t the only one with this same problem.&lt;/p&gt;  &lt;p&gt;In SSRS, you can use the following code expression to set alternating background colors on your rows as part of the Background Color property, making the data easier to read:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;=IIF(RowNumber(&lt;span&gt;Nothing&lt;/span&gt;) &lt;span&gt;MOD&lt;/span&gt; 2,"&lt;span&gt;WhiteSmoke&lt;/span&gt;","&lt;span&gt;White&lt;/span&gt;"&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;The only problem with this code is this: If your matrix has grouping on the dataset, then there is the possibility that your background colors can be inconsistent. Look at the image below to see an explanation of what happens when you use the above code snippet as your background color:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/image_04B53065.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/image_thumb_35D46B05.png" style="border-width:0px;display:inline;" title="image" alt="image" border="0" height="221" width="331"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Notice on this example how the first row is White, then the next 2 are WhiteSmoke, the next White, etc. These rows should be presented as shown below (alternating White to WhiteSmoke):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://agilebi.com/cs/blogs/musings_on_etl/image5_6E7F1512.png"&gt;&lt;img src="http://agilebi.com/cs/blogs/musings_on_etl/image5_thumb_2DDCC8A3.png" style="border-width:0px;display:inline;" title="image" alt="image" border="0" height="251" width="334"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;To accomplish this, I derived the background in SQL Server using a case statement, and then passed that column value as the background image in SSRS.&lt;/p&gt;

&lt;pre&gt;&lt;pre style="margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span&gt;CASE&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span&gt;WHEN&lt;/span&gt; &lt;font color="#ff00ff"&gt;DENSE_RANK()&lt;/font&gt; OVER (&lt;font color="#0000ff"&gt;ORDER BY&lt;/font&gt; LastName) % 2 = 1 &lt;span&gt;then&lt;/span&gt; &lt;span&gt;&lt;font color="#ff0000"&gt;'WhiteSmoke'&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span&gt;ELSE&lt;/span&gt; &lt;span&gt;&lt;font color="#ff0000"&gt;'White'&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;END&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; BGColor&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;I found a great write-up relating to the different ranking functions within SQL Server &lt;a href="http://www.4guysfromrolla.com/webtech/010406-1.shtml"&gt;here&lt;/a&gt;; if you’re confused about any of the ranking functions, I would suggest it as a good read. It is written to SQL Server 2005, but is also applicable to SQL Server 2008. The way that I am using the ranking function here, the case statement performs a MOD 2 (% 2) function on the LastName. If the result = 1, then we pick WhiteSmoke as the background color. Else, we choose White.&lt;/p&gt;

&lt;p&gt;Now, all that needs to be done is to include the BGColor column as part of your dataset, and then set the Background Color property in the cells that you want to alternate (in my case, I wanted the entire row to alternate colors, so I set BGColor as the Background Color in all of my cells).&lt;/p&gt;&lt;p&gt;Another advantage of this approach is centralized maintenance. Say, for instance, that you have a stored procedure in which you are incorporating this code, and that stored procedure is utilized by 5 different reports. If, for some reason, your user comes back saying that they want the alternating background colors to be different, then you have to physically touch each RDL file to accommodate this change. By determining the background inside SQL Server, you only have to make the change in one place -- the stored procedure.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;One thing to note: Whatever you use as your order column in your case statement (in my case, I used LastName), you have to ensure that your grouping in SSRS is also set to order by that column. Else, your row colors will once again be out of order.&lt;/p&gt;

&lt;p&gt;Hope that this write-up helps someone work around the headache that I spun my wheels working through!&lt;/p&gt;&lt;p&gt;&lt;b&gt;NOTE: &lt;/b&gt;If you enable sorting on any of your columnsin SSRS, then this approach will not work. What I have found is that you can use the function that I mentioned above, and all you need to do is to ensure that your data is presented to SSRS sorted by LastName (perform the sort in your dataset query in SSRS, and the also sort your data in the Report).&lt;/p&gt;&lt;pre style="margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;=IIF(RowNumber(&lt;span&gt;Nothing&lt;/span&gt;) &lt;span&gt;MOD&lt;/span&gt; 2,"&lt;span&gt;WhiteSmoke&lt;/span&gt;","&lt;span&gt;White&lt;/span&gt;"&lt;/pre&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=428" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://agilebi.com/cs/blogs/musings_on_etl/archive/tags/SSRS/default.aspx">SSRS</category></item><item><title>Presenting at the Triad Developers Guild</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/04/02/presenting-at-the-triad-developers-guild.aspx</link><pubDate>Thu, 01 Apr 2010 23:33:39 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:422</guid><dc:creator>jwelch</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’ll be presenting at the &lt;a href="http://www.triaddev.org/"&gt;Triad Developers Guild&lt;/a&gt; on Tuesday. The presentation will be on Developing Custom Components for SSIS, a topic I’ve spoken on a few times before. Here’s the abstract:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“SSIS data flows are great tools for moving data. But what if you need to go beyond the out-of-the-box components provided with SSIS? John Welch will describe how custom components are a great way to encapsulate and reuse functionality for the data flow in SSIS. He will discuss what it takes to create and deploy custom components in SSIS, review the pros and cons of using custom components instead of scripts, and discuss some of the common challenges and issues with creating them.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I’m looking forward to the presentation – it usually generates some good discussion, and I like talking about developing for SSIS. If you are in the area, please drop by.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=422" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Custom+Tasks+and+Components/default.aspx">Custom Tasks and Components</category></item><item><title>Developer Gaps</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/03/18/developer-gaps.aspx</link><pubDate>Thu, 18 Mar 2010 01:40:07 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:421</guid><dc:creator>jwelch</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I’ve been meaning to post about this ever since I saw Jamie’s post on “&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/01/13/the-sql-developer-gap-warning-rant-coming-up.aspx"&gt;The SQL Developer Gap&lt;/a&gt;”. I couldn’t agree more with what Jamie expressed. Prior to getting into serious BI development, I was primarily an application developer. This was at a time when agile development was becoming very popular. As part of that, refactoring, test driven development, continuous integration, and automated unit testing were becoming accepted as good software engineering practices, and tool support was coming along very quickly. &lt;/p&gt;  &lt;p&gt;Then I switched over to BI development in the SQL Server 7 time frame. In a lot of ways, it was like going back to the dark ages. No refactoring support, no automated testing, no concept of builds. Nothing significant changed until SQL Server 2005, when tools like SSIS and SSAS took their first steps toward becoming more “developer friendly” by leveraging Visual Studio to easily integrate into source control and the beginnings of multi-developer support. However, there haven’t really been any improvements in this since 2005. Refactoring, automated testing, automated builds, etc., can all be done, but they are painful and time consuming to set up, and require a fair amount of specialized knowledge to do correctly. In addition, these are all skills that the average BI developer usually doesn’t posses.&lt;/p&gt;  &lt;p&gt;To join in Jamie’s rant, this is something that has aggravated me increasingly over the last few years. In many ways, BI is ideally suited to an agile approach and developer tools that increase productivity – requirements shift on the whim of the business, you need to deliver quickly and often, and you need easy mechanisms to confirm that what you are delivering provides the correct results. There are many tasks in developing BI solutions that are repetitive and could be easily automated, if only the tools provided better support for it. And developer productivity using the SQL Server BI tools hasn’t seen a significant increase since 2005.&lt;/p&gt;  &lt;p&gt;I’m spending a fair amount of my time these days working in Visual Studio, where I have the luxury of a built in unit testing tool, the capability to switch between visual editing and text editing depending on which makes the most sense, the ability to easily do a diff between two versions in source control, a full undo-redo stack, etc. And I get to use add-ins like &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; (a fantastic tool that I can’t recommend enough). It really highlights the difference between developing traditional applications and BI applications these days.&lt;/p&gt;  &lt;p&gt;That’s part of the reason I joined Varigence, where I have the opportunity to actually help developers deliver BI solutions faster and better. Our approach makes it much easier to support the same features that you see in traditional application development tools. I’ve been pretty pleased to see how easy it is for us to add productivity features to our tools – honestly, it makes me wonder why BI developers had to wait this long for these features to be available in the tools we use on a daily basis.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=421" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSAS/default.aspx">SSAS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Agile+Practices/default.aspx">Agile Practices</category></item><item><title>Presenting ‘Enterprise Class Analysis Services Development’ at the Vancouver PASS Chapter</title><link>http://agilebi.com/cs/blogs/ddarden/archive/2010/03/10/presenting-enterprise-class-analysis-services-development-at-the-vancouver-pass-chapter.aspx</link><pubDate>Wed, 10 Mar 2010 05:38:34 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:418</guid><dc:creator>ddarden42</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Hey Guys!&lt;/p&gt;  &lt;p&gt;I’m going to be giving a presentation on Enterprise Class Analysis Services Development at the Vancouver PASS Chapter Friday, March 12th.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a title="http://vancouverbi.sqlpass.org/Home/tabid/1551/Default.aspx" href="http://vancouverbi.sqlpass.org/Home/tabid/1551/Default.aspx"&gt;http://vancouverbi.sqlpass.org/Home/tabid/1551/Default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’ll be talking about some of the topics I’ve blogged about here, including working with multiple developers, using a custom MSBuild task to build SSAS Databases, and reviewing a monitoring/reporting solution for SSAS.&amp;#160; If you don’t happen to be in Vancouver, you can always attend virtually.&amp;#160; :)&lt;/p&gt;  &lt;p&gt;Title: Enterprise Class Analysis Services Development&lt;/p&gt;  &lt;p&gt;SSAS is one of the most popular tools for OLAP, but many organizations experience challenges when attempting to use their standard development best practices with the tool. This session will cover many topics around enterprise development practices for SSAS, including how to effectively use source control with multiple developers, enable robust automated build/deployment strategies, implement usage monitoring and tracking solutions, and support unit testing for SSAS solutions.&lt;/p&gt;  &lt;p&gt;Objective 1: Demonstrate how to use source control with multiple developers.&lt;/p&gt;  &lt;p&gt;Objective 2: Show techniques to automate builds and enable robust deployment strategies.&lt;/p&gt;  &lt;p&gt;Objective 3: Review strategies for robust monitoring of multiple SSAS deployments for development, administrative, and business purposes.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=418" width="1" height="1"&gt;</description></item><item><title>SQL Saturday #33 – Coming Up Next Weekend</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/02/26/sql-saturday-33-coming-up-next-weekend.aspx</link><pubDate>Fri, 26 Feb 2010 02:42:53 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:405</guid><dc:creator>jwelch</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;The &lt;a href="http://www.sqlsaturday.com/33/eventhome.aspx"&gt;Charlotte SQL Saturday&lt;/a&gt; is coming up next weekend, March 6th. There is a great lineup of speakers presenting, and we are approaching capacity for the event, so get registered soon, if you haven’t already. It’s going to be a great day – free SQL training from a lot of well-known, well-respected names, a number of our local community members, and some Microsoft people as well. &lt;/p&gt;  &lt;p&gt;I’ll be presenting on Creating Custom Components for SSIS – a great way to extend the out-of-the-box functionality of Integration Services, and on Vulcan, an open source framework for modeling and generating portions of your BI solution. &lt;/p&gt;  &lt;p&gt;We’re got a &lt;a href="http://www.sqlsaturday.com/33/sponsors.aspx"&gt;great set of sponsors&lt;/a&gt;, including &lt;a href="http://www.sqlsentry.net"&gt;SQL Sentry&lt;/a&gt; (thanks Peter and Greg for all the work and support for the event – without them, it wouldn’t be what it is today – and if you are using SSAS, you really should check out &lt;a href="http://sqlsentry.net/performance-advisor/sql-server-analysis-services.asp"&gt;Performance Advisor for Analysis Services&lt;/a&gt;), and &lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt;, who’s providing access to their campus for the event, among other things. &lt;a href="http://www.quest.com/"&gt;Quest&lt;/a&gt;, &lt;a href="http://www.confio.com/"&gt;Confio&lt;/a&gt;, and &lt;a href="http://www.red-gate.com/about/community_relations/sql_saturday.htm?utm_source=ug&amp;amp;utm_medium=uglogo&amp;amp;utm_content=charlotte&amp;amp;utm_campaign=redgate"&gt;Red Gate&lt;/a&gt; provide some great tools for administering and developing for SQL Server, &lt;a href="http://www.intellinet.com/"&gt;Intellinet&lt;/a&gt; provides services for SQL Server, and &lt;a href="http://www.cozyroc.com/"&gt;CozyRoc&lt;/a&gt; provides a great set of SSIS tasks and components.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=405" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>Slides From the Columbia Code Camp</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/02/02/slides-from-the-columbia-code-camp.aspx</link><pubDate>Tue, 02 Feb 2010 00:41:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:400</guid><dc:creator>jwelch</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;Thanks to everyone who made it out to the Columbia Code Camp this weekend, even with the sleet and snow in the area. I had a number of requests for the slides from my presentations, so I’ve uploaded them to my SkyDrive.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://cid-71c6f14e3c205217.skydrive.live.com/self.aspx/Public/Introduction%20to%20SSIS/Introduction%20to%20SSIS.pdf"&gt;Introduction to SSIS&lt;/A&gt;&amp;nbsp;(&lt;A href="http://speakerrate.com/talks/2082-introduction-to-ssis"&gt;SpeakerRate link&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://cid-71c6f14e3c205217.skydrive.live.com/self.aspx/Public/Creating%20Custom%20Components%20for%20SSIS/Creating%20Custom%20Components%20for%20SSIS.pdf"&gt;Creating Custom Components for SSIS&lt;/A&gt;&amp;nbsp;(&lt;A href="http://speakerrate.com/talks/2083-creating-custom-components-in-ssis"&gt;SpeakerRate link&lt;/A&gt;) &amp;nbsp;(the sample component used in this presentation is on CodePlex in the &lt;A href="http://ssisctc.codeplex.com/"&gt;Community Tasks and Components project&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Thanks again for attending, and if you have any follow up questions, please leave them in the comments.&lt;/P&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=400" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>Slides From “Processing Flat Files with SSIS”</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/01/15/slides-from-processing-flat-files-with-ssis.aspx</link><pubDate>Fri, 15 Jan 2010 02:53:38 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:397</guid><dc:creator>jwelch</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Thanks to the &lt;a href="http://columbiadevelopers.org/"&gt;Columbia Enterprise Developer’s Guild&lt;/a&gt; for letting me present last night. The audience was great, and I got a lot of good questions. Several people asked if the samples could be made available, and I also had a request to post the slides for some people who weren’t able to make it. So, here they are. I’ve posted them to my &lt;a href="http://cid-71c6f14e3c205217.skydrive.live.com/self.aspx/Public/Processing%20Flat%20Files%20with%20SSIS/FlatFileExamples.zip"&gt;SkyDrive here&lt;/a&gt;. If you have any questions or comments, please feel free to leave them here.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=397" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Flat+Files/default.aspx">Flat Files</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>A New Year and Upcoming Presentations</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2010/01/09/a-new-year-and-upcoming-presentations.aspx</link><pubDate>Sat, 09 Jan 2010 03:18:18 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:395</guid><dc:creator>jwelch</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It’s a new year, and already a lot going on. The new job is going well, but keeping me extremely busy. I’ve got several upcoming presentations, and there’s a &lt;a href="http://sqlsaturday.com/33/eventhome.aspx"&gt;SQL Saturday event&lt;/a&gt; planned for Charlotte in March that I’m helping organize. I’m also happy to say that my MVP status was re-awarded for 2010. &lt;/p&gt;  &lt;p&gt;I have an upcoming presentation at the &lt;a href="http://columbiadevelopers.org/"&gt;Columbia Enterprise Developers Guild&lt;/a&gt;, next Wednesday the 13th. The presentation will be on handling flat files in SSIS.&lt;/p&gt;  &lt;h3&gt;Processing Flat Files with SSIS&lt;/h3&gt;  &lt;p&gt;When doing data integration, a common requirement is to work with flat files, whether for importing data into a system from an external source, or to export it to provide to other systems. SQL Server Integration Services (SSIS) supports flat files, but there can be a number of challenges when working with them. This is particularly true if your flat files have multiple data formats contained in a single file, the data has complex formatting, or the files have inconsistent formatting. This session will help you to be more efficient when working with these types of files. You’ll learn to handle missing delimiters in the files, and parsing files that have multiple data formats. You’ll also see how to produce complex output formats, like headers and footers that contain summary information.&lt;/p&gt;  &lt;p&gt;I’ll also be doing a couple of presentations at the &lt;a href="http://columbiacodecamp.com/"&gt;Columbia Code Camp&lt;/a&gt; on January 30th.&lt;/p&gt;  &lt;h3&gt;Creating Custom Components for SSIS&lt;/h3&gt;  &lt;p&gt;SSIS data flows are great tools for moving data. But what if you need to go beyond the out-of-the-box components provided with SSIS? Custom components are a great way to encapsulate and reuse functionality for the data flow in SSIS. We will discuss what it takes to create and deploy custom components in SSIS, review the pros and cons of using custom components instead of scripts, and discuss some of the common challenges and issues with creating them.&lt;/p&gt;  &lt;h3&gt;Introduction to SSIS&lt;/h3&gt;  &lt;p&gt;SQL Server Integration Services is a tool provided with SQL Server for moving data between data stores. It is the successor to DTS, but there are many fundamental changes in how SSIS works. This session will provide an overview of SSIS, with a focus on the key elements of SSIS that you need to know to get the most use out of it. This session will help developers efficiently use SSIS when they need to move data around the organization.&lt;/p&gt;  &lt;p&gt;If you happen to be in the area, please drop by for these presentations.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=395" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>SharePoint JavaScript Error: Library Not Registered</title><link>http://agilebi.com/cs/blogs/mcole/archive/2010/01/05/sharepoint-javascript-error-library-not-registered.aspx</link><pubDate>Tue, 05 Jan 2010 14:32:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:393</guid><dc:creator>mcole</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;The other day one of my clients upgraded from Outlook 2003 to Outlook 2007.&amp;nbsp; Since then, whenever she went to her company’s SharePoint site, she received the following error:&lt;/P&gt;
&lt;P&gt;==================================================================&lt;/P&gt;
&lt;P&gt;Website error details&lt;/P&gt;
&lt;P&gt;User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; MS-RTC LM 8; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)&lt;BR&gt;Timestamp: Mon, 4 Jan 2010 18:27:45 UTC&lt;/P&gt;
&lt;P&gt;Message: Library not registered.&lt;/P&gt;
&lt;P&gt;Line: 1935&lt;BR&gt;Char: 4&lt;BR&gt;Code: 0&lt;BR&gt;URI: http://server/_layouts/1033/init.js?rev=ck%2BHdHQ8ABQHif7kr%2Bj7iQ%3D%3D&lt;/P&gt;
&lt;P&gt;==================================================================&lt;/P&gt;
&lt;P&gt;Apparently the Outlook upgrade did something to a DLL (removed it?) that SharePoint needs.&lt;BR&gt;If you have just upgraded from Outlook 2003 to Outlook 2007 and you receive a similar error, simply run Office Diagnostics and it should fix the problem!&lt;/P&gt;
&lt;P&gt;To run Office Diagnostics follow these steps:&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp;Open Microsoft Outlook 2007.&lt;BR&gt;2.&amp;nbsp;On the Help menu, click Office Diagnostics. &lt;BR&gt;3.&amp;nbsp;Click Continue, and then click Start Diagnostics. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=393" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/MOSS/default.aspx">MOSS</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/DLL/default.aspx">DLL</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Outlook/default.aspx">Outlook</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Library+Not+Registered/default.aspx">Library Not Registered</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Office+Diagnostics/default.aspx">Office Diagnostics</category></item><item><title>Performance of Raw Files vs. Flat Files</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2009/12/14/performance-of-raw-files-vs-flat-files.aspx</link><pubDate>Mon, 14 Dec 2009 02:00:34 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:388</guid><dc:creator>jwelch</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;It’s pretty well accepted that raw files in SSIS are a very fast means of getting data in and out of the pipeline. &lt;a href="http://sqlblog.com/blogs/jamie_thomson/"&gt;Jamie Thomson&lt;/a&gt; has referenced &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/tags/raw+files/default.aspx"&gt;the use of raw files a number of times&lt;/a&gt; and &lt;a href="http://toddmcdermid.blogspot.com/"&gt;Todd McDermid&lt;/a&gt; recently posted about &lt;a href="http://toddmcdermid.blogspot.com/2009/12/using-raw-files-for-staging-data-in.html"&gt;using them for staging data&lt;/a&gt;. It occurred to me, that even though I’d always heard they were faster than other options, I’d never actually tested it to see exactly how much of a difference it would make. So, below I’ve posted some admitted unscientific performance testing between raw files and flat (or text) files.&lt;/p&gt;  &lt;p&gt;I tested two variations of flat files, delimited and ragged right. The delimited file was configured with a vertical bar (|) as the column delimiter and CR/LF as the row delimiter. The ragged right file was configured as a fixed width with row delimiters – each column had a fixed width, and a final, zero-width column was appended with CR/LF as the delimiter. The same data was used for each test, the following columns being defined:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="0"&gt;     &lt;tr&gt;       &lt;td&gt;Name&lt;/td&gt;        &lt;td&gt;Data Type&lt;/td&gt;        &lt;td&gt;Precision&lt;/td&gt;        &lt;td&gt;Scale&lt;/td&gt;        &lt;td&gt;Length&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestInt32&lt;/td&gt;        &lt;td&gt;DT_I4&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestString&lt;/td&gt;        &lt;td&gt;DT_STR&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;50&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestBool&lt;/td&gt;        &lt;td&gt;DT_BOOL&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestCurrency&lt;/td&gt;        &lt;td&gt;DT_CY&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestDBTimestamp&lt;/td&gt;        &lt;td&gt;DT_DBTIMESTAMP&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestWString&lt;/td&gt;        &lt;td&gt;DT_WSTR&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;        &lt;td&gt;50&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;TestNumeric&lt;/td&gt;        &lt;td&gt;DT_NUMERIC&lt;/td&gt;        &lt;td&gt;18&lt;/td&gt;        &lt;td&gt;6&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;One thing to note is that when importing from flat files, everything was imported as strings, to avoid any data conversion issues. This is one of the strengths of raw files – no data conversion necessary. But for this test, I was primarily looking at speed of getting the data on and off disk. I also looked at the difference in file sizes between the formats.&lt;/p&gt;  &lt;p&gt;I tested each option with 500,000, 1 million, and 10 million rows. I ran each one 4 times for each row count, and discarded the first run to offset the effects of file caching. The results of the runs were averaged for comparison.&lt;/p&gt;  &lt;p&gt;When writing files, there’s no big surprises between the options. raw files are faster on 10 million rows by 9.8 seconds. The difference on smaller numbers of rows is pretty insignificant. Here’s a chart showing the times (the raw data is at the end of the post):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image_thumb.png" width="485" height="246" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Reading files did show a difference that I didn’t expect. Read speeds on raw files and delimited files are fairly comparable, with raw files still having the edge in speed. However, reads on ragged right files are significantly slower – well over twice as slow when compared to raw files.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image_3.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image_thumb_3.png" width="485" height="294" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;File sizes were also as expected, with delimited files having a slight edge over raw files, likely because the string values I used were not all 50 characters in length.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image_4.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/RAWFilesvs.FlatFIles_11217/image_thumb_4.png" width="485" height="294" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In summary, it’s clear that raw files have an advantage in speed. However, the differences weren’t as large as I was expecting, except in the case of ragged right files. So, in general, using raw files are best for performance, but if you are dealing with row counts of less than 1 million rows, it’s not a huge difference unless you are really concerned with performance. Of course, there are plenty of other differences between the formats, and I’d encourage you to research them before making a decision.&lt;/p&gt;  &lt;p&gt;Here’s the raw data on the number of seconds to produce each file:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="0"&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;500,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1,000,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;10,000,000&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Write To Delimited&lt;/td&gt;        &lt;td&gt;2.61&lt;/td&gt;        &lt;td&gt;5.16&lt;/td&gt;        &lt;td&gt;47.02&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Write To Ragged&lt;/td&gt;        &lt;td&gt;2.66&lt;/td&gt;        &lt;td&gt;5.31&lt;/td&gt;        &lt;td&gt;49.03&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Write To Raw&lt;/td&gt;        &lt;td&gt;2.21&lt;/td&gt;        &lt;td&gt;4.23&lt;/td&gt;        &lt;td&gt;39.21&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;500,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1,000,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;10,000,000&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Read From Delimited&lt;/td&gt;        &lt;td&gt;0.77&lt;/td&gt;        &lt;td&gt;1.52&lt;/td&gt;        &lt;td&gt;16.59&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Read From Ragged&lt;/td&gt;        &lt;td&gt;2.74&lt;/td&gt;        &lt;td&gt;5.89&lt;/td&gt;        &lt;td&gt;35.39&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Read From Raw&lt;/td&gt;        &lt;td&gt;0.60&lt;/td&gt;        &lt;td&gt;1.08&lt;/td&gt;        &lt;td&gt;10.03&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;and the file size in KB for each:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="0"&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;500,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1,000,000&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;10,000,000&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Delimited&lt;/td&gt;        &lt;td&gt;44,624&lt;/td&gt;        &lt;td&gt;89,792&lt;/td&gt;        &lt;td&gt;946,745&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Ragged&lt;/td&gt;        &lt;td&gt;92,286&lt;/td&gt;        &lt;td&gt;184,571&lt;/td&gt;        &lt;td&gt;1,845,704&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Raw&lt;/td&gt;        &lt;td&gt;47,039&lt;/td&gt;        &lt;td&gt;94,402&lt;/td&gt;        &lt;td&gt;973,308&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;Please let me know if you’d like more details or have any questions. &lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=388" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Performance/default.aspx">Performance</category></item><item><title>New Path, Same Focus</title><link>http://agilebi.com/cs/blogs/bipartisan/archive/2009/12/05/new-path-same-focus.aspx</link><pubDate>Sat, 05 Dec 2009 03:43:08 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:384</guid><dc:creator>jwelch</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I’ve worked with &lt;a href="http://www.mariner-usa.com"&gt;Mariner&lt;/a&gt; for almost 12 years. It’s been a very good journey, with many great experiences. I’ve worked with a lot of great people, and delivered some really interesting BI solutions to clients in a number of industries. One aspect of my job that I always particularly enjoyed was helping developers be more productive when creating BI solutions, and reducing the repetitive (read: “boring”) aspects of developing solutions on the Microsoft stack. &lt;/p&gt;  &lt;p&gt;Recently, a new opportunity to focus more heavily on that came along. As a result, after a long and enjoyable career with Mariner doing business intelligence consulting, I am taking a new position with &lt;a href="http://www.varigence.com/"&gt;Varigence&lt;/a&gt;, a company that is producing tools that will make implementing BI solutions faster and easier, as well as introduce new capabilities and better integration into the Microsoft BI stack.&lt;/p&gt;  &lt;p&gt;I’m really looking forward to the new role and the new experiences it will offer. I will continue to be heavily involved in Microsoft BI, so I plan to maintain this blog and continue speaking and writing on it as often as often as possible.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=384" width="1" height="1"&gt;</description></item><item><title>New Path, Same Focus</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2009/12/05/new-path-same-focus.aspx</link><pubDate>Sat, 05 Dec 2009 03:40:08 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:383</guid><dc:creator>jwelch</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I’ve worked with &lt;a href="http://www.mariner-usa.com"&gt;Mariner&lt;/a&gt; for almost 12 years. It’s been a very good journey, with many great experiences. I’ve worked with a lot of great people, and delivered some really interesting BI solutions to clients in a number of industries. One aspect of my job that I always particularly enjoyed was helping developers be more productive when creating BI solutions, and reducing the repetitive (read: “boring”) aspects of developing solutions on the Microsoft stack. &lt;/p&gt;  &lt;p&gt;Recently, a new opportunity to focus more heavily on that came along. As a result, after a long and enjoyable career with Mariner doing business intelligence consulting, I am taking a new position with &lt;a href="http://www.varigence.com/"&gt;Varigence&lt;/a&gt;, a company that is producing tools that will make implementing BI solutions faster and easier, as well as introduce new capabilities and better integration into the Microsoft BI stack.&lt;/p&gt;  &lt;p&gt;I’m really looking forward to the new role and the new experiences it will offer. I will continue to be heavily involved in Microsoft BI, so I plan to maintain this blog and continue speaking and writing on it as often as often as possible.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=383" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/BI/default.aspx">BI</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Speaking/default.aspx">Speaking</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category></item><item><title>Sample Files for Introduction To Analysis Services 2008</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2009/12/04/sample-files-for-introduction-to-analysis-services-2008.aspx</link><pubDate>Fri, 04 Dec 2009 16:44:59 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:382</guid><dc:creator>jwelch</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;We had good turnout at the Greenville, SC &lt;a href="http://ssig.org/"&gt;SSIG&lt;/a&gt; on Tuesday. If you attended, I hope you enjoyed the presentation. After the meeting, I promised several attendees that I would make the samples developed during the demo available, and &lt;a href="http://cid-695cdda853ce07ee.skydrive.live.com/self.aspx/Public/BI%20Thoughts%20and%20Theories/SSIG%20-%20Intro%20to%20SSAS%202008.zip"&gt;here they are&lt;/a&gt;. The zip includes both the SSAS project files, and a backup the sample database that the cube was built on. Both are done using the 2008 version of SQL Server.&lt;/p&gt;  &lt;p&gt;If you have any questions about , please post them in the comments.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=382" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSAS+2008/default.aspx">SSAS 2008</category></item><item><title>Reporting Services Color Constants: LightGray or LightGrey?  (Or perhaps LightGrae instead?)</title><link>http://agilebi.com/cs/blogs/mcole/archive/2009/12/03/reporting-services-color-constants-lightgray-or-lightgrey-perhaps-lightgrae-instead.aspx</link><pubDate>Thu, 03 Dec 2009 21:32:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:380</guid><dc:creator>mcole</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;I've always struggled with the correct spelling of the word "gray": is it "gray" with an &lt;EM&gt;a&lt;/EM&gt; or is it "grey" with an &lt;EM&gt;e&lt;/EM&gt;?&amp;nbsp; According to the Internet and my spellchecker, both spellings are correct.&amp;nbsp; Maybe the spelling should be changed to include both the a &lt;EM&gt;and&lt;/EM&gt; the e, as in "graey".&amp;nbsp; Ditching the y wouldn't be a bad idea either.&lt;/P&gt;
&lt;P&gt;I suspect it will be a good long while before the world adopts my new spelling but luckily I'm not the only one with this deficiency.&amp;nbsp; Apparently the word grae is something the Reporting Services developers over at Microsoft struggle with too.&lt;/P&gt;
&lt;P&gt;Notice how the constants for the Color property are different depending on whether you're looking at the Properties window or Expression window.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://agilebi.com/cs/blogs/mcole/image_5EE900A9.png"&gt;&lt;IMG title=image style="BORDER-RIGHT:0px;BORDER-TOP:0px;DISPLAY:inline;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height=441 alt=image src="http://agilebi.com/cs/blogs/mcole/image_thumb_13895CE5.png" width=295 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://agilebi.com/cs/blogs/mcole/image_172777C2.png"&gt;&lt;IMG title=image style="BORDER-RIGHT:0px;BORDER-TOP:0px;DISPLAY:inline;BORDER-LEFT:0px;WIDTH:540px;BORDER-BOTTOM:0px;HEIGHT:515px;" height=524 alt=image src="http://agilebi.com/cs/blogs/mcole/image_thumb_7DBF7487.png" width=580 border=0&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=380" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Color/default.aspx">Color</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Gray/default.aspx">Gray</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/LightGray/default.aspx">LightGray</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/Grey/default.aspx">Grey</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/LightGrey/default.aspx">LightGrey</category><category domain="http://agilebi.com/cs/blogs/mcole/archive/tags/SSRS/default.aspx">SSRS</category></item><item><title>Presenting At SSIG in Greenville, SC</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2009/11/29/presenting-at-ssig-in-greenville-sc.aspx</link><pubDate>Sun, 29 Nov 2009 20:35:22 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:376</guid><dc:creator>jwelch</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I’ll be doing a presentation on Analysis Services at the &lt;a href="http://ssig.org/"&gt;SQL Server Innovators Guild&lt;/a&gt; in Greenville, SC on Tuesday, Dec. 1st. I’ll be delivering an introduction to SSAS, with lots of demos. If you are interested in attending, please &lt;a href="http://bit.ly/T8erq"&gt;register here&lt;/a&gt;. It’s a presentation that I’ve done a few times now, but because it’s mostly demo, something new and interesting always comes up.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Introduction to Analysis Services 2008&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This session is intended to introduce database developers to Analysis Services 2008, with a focus on being able to quickly construct usable OLAP cubes. This presentation will be light on slides, and heavy on demonstrating how to perform the steps to create the cubes. During this session, we will cover the creation of a new cube from an existing database step by step. We will also highlight the reasons for using Analysis Services, and applicable scenarios for using it.&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=376" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Presentations/default.aspx">Presentations</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSAS+2008/default.aspx">SSAS 2008</category></item><item><title>SSIS 101: Viewing Variable Values at Runtime</title><link>http://agilebi.com/cs/blogs/jwelch/archive/2009/11/29/ssis-101-viewing-variable-values-at-runtime.aspx</link><pubDate>Sun, 29 Nov 2009 17:00:00 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:377</guid><dc:creator>jwelch</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;One of the common problems that beginners have with SSIS is debugging errors involving variables. One example of this occurs when a package uses a Foreach Loop container. These are often used to set a variable value differently for each iteration of a loop. If something fails during the loop, you might want to check the value of the variable in order to determine what went wrong. &lt;/p&gt;  &lt;p&gt;Fortunately, this is pretty easy to accomplish in SSIS. You can see the value of any package variable in BIDS when you debug the package by following the steps below:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;First, set a breakpoint on a task where you'd like to check the current variable values. You can set a breakpoint by right-clicking on the task and choosing Edit Breakpoints.&lt;a href="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_thumb.png" width="366" height="293" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Choose OnPreExecute to see values before the task executes and OnPostExecute to see them after execution. Click OK after enabling the breakpoint.     &lt;br /&gt;&lt;a href="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_3.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_thumb_3.png" width="616" height="454" /&gt;&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;Run the package in debug mode (press F5) in Visual Studio. The package will run until the breakpoint is hit.     &lt;br /&gt;&lt;a href="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_4.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_thumb_4.png" width="195" height="164" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Once execution stops at the breakpoint, open the Locals window (Ctrl+Alt+V, L or Debug..Windows..Locals)     &lt;br /&gt;&lt;a href="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_thumb_5.png" width="465" height="148" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Expand the Variable node in the Locals window. You can see the current values for all your variables, including system variables, in this window. You may have to scroll down to see your variables in the list     &lt;br /&gt;&lt;a href="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_6.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.agilebi.com/images/ViewingVariableValuesatRuntime_10D89/image_thumb_6.png" width="622" height="204" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This is a useful technique for troubleshooting packages that use variables, particularly if the variable values are changed during package execution. &lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=377" width="1" height="1"&gt;</description><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/SSIS+101/default.aspx">SSIS 101</category><category domain="http://agilebi.com/cs/blogs/jwelch/archive/tags/Debugging/default.aspx">Debugging</category></item><item><title>Using MSBuild with SQL Server Analysis Services Projects</title><link>http://agilebi.com/cs/blogs/ddarden/archive/2009/11/16/using-msbuild-with-sql-server-analysis-services-projects.aspx</link><pubDate>Mon, 16 Nov 2009 17:05:10 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:373</guid><dc:creator>ddarden42</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’ve written several blogs and community samples on working with SSAS Projects directly using AMO (instead of SSAS Databases on an Analysis Services server).&amp;#160; I was travelling this weekend, and got a chance to create a sample MSBuild task that will generate a .ASDatabase file directly from a Visual Studio project, without requiring Visual Studio itself.&amp;#160; This means that multiple developers can work on a project, check-in files via source control, and can schedule an automated build, build on a dedicated “clean” machine (without VS), or any of a number of other scenarios.&lt;/p&gt;  &lt;p&gt;I added the custom MSBuild task to the &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/" target="_blank"&gt;Analysis Services Community Samples&lt;/a&gt; project on &lt;a href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; under the &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22769#DownloadId=84147" target="_blank"&gt;SsasHelper sample&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The Build task code itself is trivial.&amp;#160; I won’t go into a lot of detail on that, has creating/debugging custom tasks is well documented (you can start the library with MSBuild.exe as the external program and the project file as the argument).&amp;#160; I used it as a wrapper for previously developed ProjectHelper code that does all the heavy lifting.&amp;#160; All we do is inherit from &lt;em&gt;Microsoft.Build.Utilities.Task &lt;/em&gt;and implement the &lt;em&gt;Execute &lt;/em&gt;method.&amp;#160; All I do in the task is de-serialize the project (based on the Visual Studio project passed in), validate the project (based on the target version of SSAS), and write out the .ASDatabase file.&amp;#160; This could of course be modified to use another method to deploy the database, but I’ve been using the .ASDatabase method for awhile with no issues.&lt;/p&gt;  &lt;p&gt;Here’s the main code for the method:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     Database database = ProjectHelper.DeserializeProject(SsasProjectFile);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// ... Verify our project doesn't have any errors ...&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     ValidationResultCollection results;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isValidated = ProjectHelper.ValidateDatabase(database, SsasServerEdition, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; results);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// If the database doesn't validate (i.e., a build error)&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// log the errors and return failure.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ValidationResult result &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; results)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         Log.LogError(result.Description);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!isValidated)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Build the .ASDatabase file&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;     ProjectHelper.GenerateASDatabaseFile(database, SsasTargetFile);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;     Log.LogErrorFromException(ex);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;So… how do we actually use this?&amp;#160; I included a sample project file in the &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22769#DownloadId=84147" target="_blank"&gt;SsasBuilder&lt;/a&gt; project.&amp;#160; The basic idea is you have a project file (a file that ends in “.[optional prefix]proj”, such as “.proj”, “.csproj”, etc.).&amp;#160; You can call this via MSBuild.&amp;#160; Note that the standard SSAS project file DOES NOT work with MSBuild.&amp;#160; The schemas required for that project conflict with the MSBuild schema, so you’ll have to create another project file, or build the build step into somewhere else.&amp;#160; Here’s an example project file:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;UsingTask&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TaskName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SsasBuilder.SsasBuildASDatabaseFileTask&amp;quot;&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;         &lt;span style="color:#ff0000;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;C:\TFS\SsasHelper\SsasBuilder\bin\debug\SsasBuilder.dll&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;BuildASDatabaseFile&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SsasBuildASDatabaseFileTask&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;SsasProjectFile&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;&amp;quot;C:\Test\enterprise_Gold\Adventure Works DW 2008.dwproj&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;             &lt;span style="color:#ff0000;"&gt;SsasTargetFile&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;&amp;quot;C:\Test\SsasBuildTest\AdventureWorks.ASDtabase&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;             &lt;span style="color:#ff0000;"&gt;SsasServerEdition&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;&amp;quot;Enterprise&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here I’m using absolute paths, but you can use either properties or relative paths as required for your particular project.&amp;#160; You just use a &lt;strong&gt;UsingTask &lt;/strong&gt;tag to point to the assembly containing the build task, then use the task in a target.&amp;#160; For this sample I’m I’m taking the SSAS project file and target filename, along with the server edition, as parameters.&amp;#160; If there are no errors in the project file, the .ASDatabase file will be generated in the specified location.&lt;/p&gt;

&lt;p&gt;Now, all you have to do is call “MSBuild.exe &amp;lt;Whateveryounamedyourproject&amp;gt;”, and you’ll get a .ASDatabase file out of it…&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;

&lt;p&gt;David&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=373" width="1" height="1"&gt;</description></item><item><title>Validating SSAS Projects Programmatically</title><link>http://agilebi.com/cs/blogs/ddarden/archive/2009/11/06/validating-ssas-projects-programmatically.aspx</link><pubDate>Fri, 06 Nov 2009 07:22:58 GMT</pubDate><guid isPermaLink="false">cff69b52-6b3d-4997-ae55-6e5cb52a8941:371</guid><dc:creator>ddarden42</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Earlier this week I got a feature request from someone someone that was looking in to my &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22769#DownloadId=84147"&gt;SsasHelper&lt;/a&gt; sample on the &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/"&gt;Microsoft SQL Server Community Samples:&amp;#160; Analysis Services&lt;/a&gt; site on &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;.&amp;#160; She was interested in &lt;a href="http://agilebi.com/cs/blogs/ddarden/archive/2009/05/31/building-a-sql-server-analysis-services-asdatabase-file-from-a-as-project.aspx" target="_blank"&gt;Building a SQL Server Analysis Services .ASDatabase file from a Visual Studio SSAS Project&lt;/a&gt;, but pointed out that I didn’t actually &lt;strong&gt;*validate*&lt;/strong&gt; a project before creating the .ASDatabase file, so if someone had checked in a project with errors, the whole process could blow up (or we might deploy a database with some issues).&amp;#160; I looked into doing this, and it turns out it’s really easy to accomplish.&amp;#160; I updated the code in &lt;a href="http://sqlsrvanalysissrvcs.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22769#DownloadId=84147"&gt;SsasHelper&lt;/a&gt; sample on &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; to show how to do this.&lt;/p&gt;  &lt;p&gt;The actual code is really simple:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; doesBuild = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; results = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ValidationResultCollection();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// We have to provide a ServerEdition for this method to work.  There are &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// overloads that look like the will work without them, but they can't be used&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// in this scenario.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// The ServerEdition might need to be changed for your situation.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// This can be modified to return warnings and messages as well.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; doesBuild = database.Validate(results, ValidationOptions.None, ServerEdition.Developer);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; doesBuild;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You can use the method I created like so:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; Database database;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; hasErrors = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// Load a SSAS database object based on a BIDS project&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; database = ProjectHelper.DeserializeProject(ssasProjectFile);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// ... Verify our project doesn't have any errors ...&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt; ValidationResultCollection results;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; hasErrors = ProjectHelper.ValidateDatabase(database, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; results);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ValidationResult result &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; results)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     Console.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;, result.Description));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt; Console.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Project is Error Free?  {0}&amp;quot;&lt;/span&gt;, hasErrors));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt; Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Project validated!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This will take a Database object and validate it to see if there are any errors.&amp;#160; You can modify it to return Warnings and Messages as well by changing the Validation Options.&lt;/p&gt;

&lt;p&gt;One thing to note is that the Server Edition is a required parameter.&amp;#160; There are a few overloads of the Validate method that don’t require this parameter, but what they try and do is walk up the object tree to get the Server object (associated with the Database) and retrieve the edition.&amp;#160; Since I’m de-serializing a project into a Database object, this property isn’t available (and can’t be set).&amp;#160; It is important to use this method with the correct Server Edition.&amp;#160; The validation process will throw errors if you use some (but I don’t think &lt;strong&gt;*all*&lt;/strong&gt;) of the features for a different edition.&amp;#160; For example, if your project includes Translations (an Enterprise-only feature), validation will succeed if you use ServerEdition.Developer or ServerEdition.Enterprise, but will fail if you use ServerEdition.Standard.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;

&lt;p&gt;David&lt;/p&gt;&lt;img src="http://agilebi.com/cs/aggbug.aspx?PostID=371" width="1" height="1"&gt;</description></item></channel></rss>