<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5733427176767844093</id><updated>2011-12-29T12:49:58.095Z</updated><category term='Rugby'/><category term='SQL Server 2012'/><category term='T-SQL'/><category term='Blogs'/><category term='SSIS'/><category term='SSMS'/><category term='Cricket'/><title type='text'>An idea or two...</title><subtitle type='html'>Lessons learned during my SQL Server BI implementations and the occassional gum flap about sport.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-2741489307259874152</id><published>2011-12-29T12:02:00.002Z</published><updated>2011-12-29T12:24:36.716Z</updated><title type='text'>I'm back!</title><content type='html'>Due to technical difficulties (on my other blog) I have decided to move back here again.&lt;br /&gt;&lt;br /&gt;I know I haven't been the most frequent blogger but I'm hoping the new year brings with it the new desire to blog with greater regularity.&lt;br /&gt;&lt;br /&gt;I will also be moving the blogs from the other site back to this one...&lt;br /&gt;&lt;br /&gt;See you soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-2741489307259874152?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/2741489307259874152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=2741489307259874152&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2741489307259874152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2741489307259874152'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2011/12/im-back.html' title='I&apos;m back!'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Johannesburg, South Africa</georss:featurename><georss:point>-26.2041028 28.0473051</georss:point><georss:box>-26.3180783 27.8893766 -26.090127300000002 28.2052336</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6855117070671810268</id><published>2011-10-18T14:48:00.000Z</published><updated>2011-12-29T12:49:58.101Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2012'/><title type='text'>SQL PASS 2011</title><content type='html'>After a long flight back from what might be the furthest distance from South Africa, I am back in JHB from a great SQL PASS in Seattle.&lt;br /&gt;&lt;br /&gt;This was my first PASS and I though the whole experience was top notch. The colleagues I went with, the old colleagues I met up with there as well as a pretty well organised event made it all a very enjoyable experience.&lt;br /&gt;&lt;br /&gt;The slight downer would have to be the badly organised schedule with key sessions conflicting and the poorly planned room allocation. Key speakers with their key topics were often placed in smaller rooms which were then closed minutes before the start due to vast numbers and demand. This actually caused us to miss Marco Russo’s “Vertipaq vs OLAP: Change your data modelling approach”, which was very disappointing.&lt;br /&gt;&lt;br /&gt;But besides that, I managed to attend some really good sessions. I will be going through these along with some of my personal findings with regard Denali (now called SQL Server 2012) in my next few blog posts.&lt;br /&gt;&lt;br /&gt;Please pop in and have a read when they are available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6855117070671810268?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6855117070671810268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6855117070671810268&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6855117070671810268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6855117070671810268'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2011/10/after-long-flight-back-from-what-might.html' title='SQL PASS 2011'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Johannesburg, South Africa</georss:featurename><georss:point>-26.2041028 28.0473051</georss:point><georss:box>-26.3180783 27.8893766 -26.090127300000002 28.2052336</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-2949964887455354254</id><published>2011-05-26T07:52:00.001Z</published><updated>2011-05-26T07:54:19.971Z</updated><title type='text'>SSIS Data Cleansing – Regular Expressions</title><content type='html'>Check out my latest &lt;a href="http://www.twentyoneten.co.za/?p=96"&gt;post&lt;/a&gt; about data cleansing with regular expressions...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-2949964887455354254?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/2949964887455354254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=2949964887455354254&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2949964887455354254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2949964887455354254'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2011/05/ssis-data-cleansing-regular-expressions.html' title='SSIS Data Cleansing – Regular Expressions'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-1073909890592390712</id><published>2011-05-16T10:13:00.002Z</published><updated>2011-05-16T10:15:51.067Z</updated><title type='text'>Blog moved!</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;Please be aware that I have moved my blog to &lt;a href="http://www.twentyoneten.co.za/?author=3"&gt;TwentyOneTen&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Colin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-1073909890592390712?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/1073909890592390712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=1073909890592390712&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/1073909890592390712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/1073909890592390712'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2011/05/blog-moved.html' title='Blog moved!'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-2773011100935142694</id><published>2011-05-10T13:00:00.002Z</published><updated>2011-05-10T13:02:47.046Z</updated><title type='text'>New Blog</title><content type='html'>Please find my latest blog post &lt;a href="http://www.twentyoneten.co.za/?p=37"&gt;here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-2773011100935142694?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/2773011100935142694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=2773011100935142694&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2773011100935142694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2773011100935142694'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2011/05/new-blog.html' title='New Blog'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-5100447137408949404</id><published>2009-05-08T15:34:00.001Z</published><updated>2009-05-08T15:34:44.469Z</updated><title type='text'>Analysis Services Partition Creation in SSIS</title><content type='html'>&lt;p&gt;On my return from a short holiday last week (South Africa had two public holidays in one week – Monday and Friday so taking 3 days off gave me the whole week ; ) ) I found an email from a blog reader (Ashkan) asking me to add a blog about SSAS partition creation in SSIS. I had promised that I would in my previous &lt;a href="http://colinkirkby.blogspot.com/2009/02/analysis-services-partition-processing.html"&gt;blog&lt;/a&gt; so I thought I better get to work.&lt;/p&gt;  &lt;p&gt;So here it is…&lt;/p&gt;  &lt;p&gt;For this example, I am going to discuss how I usually set up SSAS partitioning on a new cube. In most cases, this is at the stage when the warehouse is fully populated with history data and I need to create a large number of SSAS partitions to represent all this data. So what we need to start is a cube that has been deployed to a SSAS server. (This example will add partitions to the an existing cube on a server not partitions (metadata) to a cube in an Analysis Services project.) This deployed cube will have at least one measure group in it and just the default partition. What I would then need to do, is change the default partition’s query definition to point to my first data set, usually my first month in my warehouse (assuming we are partitioning by month) and then use the following code to create all the partitions that I need.&lt;/p&gt;  &lt;p&gt;For this example, I am going to use the sample SSAS database Adventure Works and more specifically the default partition, Internet_Sales which is part of the Measure Group, Internet Sales in the cube, Adventure Works DW. &lt;/p&gt;  &lt;p&gt;This partition’s source is set to table binding and is mapped to a specific source table in the cube’s DSV. For this example, I want to partition the measure group against a single fact table aiming each partition at a specific month in that table. Therefore I need to change the partition to query binding and set the source value to:&lt;/p&gt;  &lt;p&gt;SELECT fis.[ProductKey],fis.[OrderDateKey],fis.[DueDateKey],fis.[ShipDateKey],fis.[CustomerKey],fis.[PromotionKey],fis.[CurrencyKey],fis.[SalesTerritoryKey],fis.[SalesOrderNumber],fis.[SalesOrderLineNumber],fis.[RevisionNumber],fis.[OrderQuantity],fis.[UnitPrice],fis.[ExtendedAmount],fis.[UnitPriceDiscountPct],fis.[DiscountAmount],fis.[ProductStandardCost],fis.[TotalProductCost],fis.[SalesAmount],fis.[TaxAmt],fis.[Freight],fis.[CarrierTrackingNumber],fis.[CustomerPONumber],    &lt;br /&gt;CONVERT ( CHAR ( 10 ), SalesOrderNumber )&amp;#160; + 'Line '&amp;#160; + CONVERT ( CHAR ( 4 ), SalesOrderLineNumber ) AS [SalesOrderDesc]     &lt;br /&gt;FROM [dbo].[FactInternetSales] fis     &lt;br /&gt;INNER JOIN dbo.DimTime dt     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ON fis.OrderDateKey = dt.TimeKey     &lt;br /&gt;WHERE Cast(Convert(varchar(6), FullDateAlternateKey, 112) as int) =&amp;#160; 200107&lt;/p&gt;  &lt;p&gt;(I realise that this is not the best SQL query in the world but it illustrates the point)&lt;/p&gt;  &lt;p&gt;The partition Internet_Sales should then be renamed to something that makes more sense. I usually name partitions according to the measure group to which they belong and the specific month they are assigned to. e.g. InternetSales200107&lt;/p&gt;  &lt;p&gt;Once this has been done we have a complete partition that we can use to clone more… and you thought cloning was illegal! ; )&lt;/p&gt;  &lt;p&gt;In my previous &lt;a href="http://colinkirkby.blogspot.com/2009/02/analysis-services-partition-processing.html"&gt;blog&lt;/a&gt; (Analysis Services Partition Processing), I went into a lot of detail explaining the script task and how I prefer to capture the XMLA and executing it against the server using an Analysis Services DDL Task. This SSIS package is very similar and therefore I am not going to repeat all that detail here but rather provide the code that is different and follow up with an explanation.&lt;/p&gt;  &lt;p&gt;The Script Task’s code would look like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;System, System.Data, System.Math, Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;AMO = Microsoft.AnalysisServices&lt;br /&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;Microsoft.AnalysisServices.QueryBinding&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;Public Class &lt;/span&gt;ScriptMain&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;Public Sub &lt;/span&gt;Main()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;Dim &lt;/span&gt;amoServer &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.Server, amoMeasureGroup &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.MeasureGroup&lt;br /&gt;        &lt;span style="color: blue"&gt;Dim &lt;/span&gt;amoPartition &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.Partition, oVariables &lt;span style="color: blue"&gt;As &lt;/span&gt;Variables = Dts.Variables&lt;br /&gt;        &lt;span style="color: blue"&gt;Dim &lt;/span&gt;strXMLAScript &lt;span style="color: blue"&gt;As String&lt;/span&gt;, strTaskName &lt;span style="color: blue"&gt;As String&lt;br /&gt;        Dim &lt;/span&gt;amoQueryBinding &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.QueryBinding, amoNewPartition &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.Partition&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;Try&lt;br /&gt;            &lt;/span&gt;Dts.VariableDispenser.LockOneForRead(&lt;span style="color: #a31515"&gt;&amp;quot;System::TaskName&amp;quot;&lt;/span&gt;, oVariables)&lt;br /&gt;            strTaskName = oVariables.Item(&lt;span style="color: #a31515"&gt;&amp;quot;System::TaskName&amp;quot;&lt;/span&gt;).Value.ToString&lt;br /&gt;&lt;br /&gt;            amoServer = &lt;span style="color: blue"&gt;New &lt;/span&gt;AMO.Server()&lt;br /&gt;            amoServer.Connect(&lt;span style="color: #a31515"&gt;&amp;quot;Data Source=LOCALHOST;Initial Catalog=Adventure Works DW;&amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;                &lt;span style="color: #a31515"&gt;&amp;quot;Provider=MSOLAP.3;Integrated Security=SSPI;Impersonation Level=Impersonate;&amp;quot;&lt;/span&gt;)&lt;br /&gt;            amoMeasureGroup = amoServer.Databases.FindByName(amoServer.ConnectionInfo.Catalog _&lt;br /&gt;                .ToString).Cubes.FindByName(&lt;span style="color: #a31515"&gt;&amp;quot;Adventure Works&amp;quot;&lt;/span&gt;).MeasureGroups. _&lt;br /&gt;                FindByName(&lt;span style="color: #a31515"&gt;&amp;quot;Internet Sales&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;            amoServer.CaptureXml = &lt;span style="color: blue"&gt;True&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;' Get first partition&lt;br /&gt;            &lt;/span&gt;amoPartition = amoMeasureGroup.Partitions(0)&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;' Loop through number of partitions needed&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;For &lt;/span&gt;iMonth &lt;span style="color: blue"&gt;As Integer &lt;/span&gt;= 200108 &lt;span style="color: blue"&gt;To &lt;/span&gt;200112&lt;br /&gt;&lt;br /&gt;                amoNewPartition = amoPartition.Clone()&lt;br /&gt;                amoNewPartition.ID = &lt;span style="color: #a31515"&gt;&amp;quot;InternetSales &amp;quot; &lt;/span&gt;&amp;amp; iMonth&lt;br /&gt;                amoNewPartition.Name = &lt;span style="color: #a31515"&gt;&amp;quot;InternetSales &amp;quot; &lt;/span&gt;&amp;amp; iMonth&lt;br /&gt;                amoNewPartition.Slice = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot; &lt;/span&gt;&lt;span style="color: green"&gt;' Add as needed&lt;br /&gt;&lt;br /&gt;                ' Create new query binding&lt;br /&gt;                &lt;/span&gt;amoQueryBinding = &lt;span style="color: blue"&gt;New &lt;/span&gt;AMO.QueryBinding&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: green"&gt;' Set new query binding&lt;br /&gt;                &lt;/span&gt;amoQueryBinding.QueryDefinition = GetQueryBindingText(iMonth.ToString)&lt;br /&gt;                amoQueryBinding.DataSourceID = amoPartition.DataSource.ID&lt;br /&gt;                amoNewPartition.Source = amoQueryBinding&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: green"&gt;' Add to measure group and update parition&lt;br /&gt;                &lt;/span&gt;amoMeasureGroup.Partitions.Add(amoNewPartition)&lt;br /&gt;                amoNewPartition.Update()&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: green"&gt;' Report progress&lt;br /&gt;                &lt;/span&gt;Dts.Events.FireInformation(0, strTaskName, &lt;span style="color: #a31515"&gt;&amp;quot;Added partition - &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;                    amoNewPartition.Name &amp;amp; &lt;span style="color: #a31515"&gt;&amp;quot; to create partition list.&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;String&lt;/span&gt;.Empty, _&lt;br /&gt;                    0, &lt;span style="color: blue"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;Next&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;' Set in transaction and in parallel properties and capture&lt;br /&gt;            &lt;/span&gt;strXMLAScript = amoServer.ConcatenateCaptureLog(&lt;span style="color: blue"&gt;True&lt;/span&gt;, &lt;span style="color: blue"&gt;False&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;' Write to package variable&lt;br /&gt;            &lt;/span&gt;Dts.VariableDispenser.LockOneForWrite(&lt;span style="color: #a31515"&gt;&amp;quot;User::strXMLAScript&amp;quot;&lt;/span&gt;, oVariables)&lt;br /&gt;            oVariables.Item(&lt;span style="color: #a31515"&gt;&amp;quot;User::strXMLAScript&amp;quot;&lt;/span&gt;).Value = strXMLAScript&lt;br /&gt;&lt;br /&gt;            Dts.TaskResult = Dts.Results.Success&lt;br /&gt;        &lt;span style="color: blue"&gt;Catch &lt;/span&gt;ex &lt;span style="color: blue"&gt;As &lt;/span&gt;Exception&lt;br /&gt;            Dts.Events.FireError(0, strTaskName, ex.Message, &lt;span style="color: blue"&gt;String&lt;/span&gt;.Empty, 0)&lt;br /&gt;        &lt;span style="color: blue"&gt;End Try&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    Private Function &lt;/span&gt;GetQueryBindingText(&lt;span style="color: blue"&gt;ByVal &lt;/span&gt;strMonth &lt;span style="color: blue"&gt;As String&lt;/span&gt;) &lt;span style="color: blue"&gt;As String&lt;br /&gt;&lt;br /&gt;        Return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;SELECT fis.[ProductKey],fis.[OrderDateKey],fis.[DueDateKey],fis.[ShipDateKey],&amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[CustomerKey],fis.[PromotionKey],fis.[CurrencyKey],fis.[SalesTerritoryKey],&amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[SalesOrderNumber], fis.[SalesOrderLineNumber], fis.[RevisionNumber],&amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[OrderQuantity],fis.[UnitPrice],fis.[ExtendedAmount],&amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[UnitPriceDiscountPct], &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[DiscountAmount], fis.[ProductStandardCost], fis.[TotalProductCost], &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[SalesAmount], fis.[TaxAmt], fis.[Freight], fis.[CarrierTrackingNumber], &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;fis.[CustomerPONumber], &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;CONVERT ( CHAR ( 10 ), SalesOrderNumber )  + 'Line '  + CONVERT ( CHAR ( 4 ), &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;SalesOrderLineNumber ) AS [SalesOrderDesc] &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;FROM [dbo].[FactInternetSales] fis &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;INNER JOIN dbo.DimTime dt &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;         &lt;span style="color: #a31515"&gt;&amp;quot;ON fis.OrderDateKey = dt.TimeKey &amp;quot; &lt;/span&gt;&amp;amp; _&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;WHERE Cast(Convert(varchar(6), FullDateAlternateKey, 112) as int) = &amp;quot; &lt;/span&gt;&amp;amp; strMonth&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;End Function&lt;br /&gt;&lt;br /&gt;End Class&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This code will loop through a list of your choice (I have simply chosen to loop through 5 months to prove the concept) creating new partitions. This is done by cloning the existing one (the one we edited earlier) and then overwriting the properties that need to be changed. These properties include the partition ID, Name and the query binding. If the cube is using a slicer then you could overwrite this property too. I haven’t included it in this example.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Please notice that I needed to change the parallel argument in the ConcatenateCaptureLog method to false from the example in my previous blog.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;strXMLAScript = amoServer.ConcatenateCaptureLog(&lt;span style="color: blue"&gt;True&lt;/span&gt;, &lt;span style="color: blue"&gt;False&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Once this is complete, you can execute the package and it will create all the partitions you would like (or at least according to your loop). Or create new partitions (by making a few alterations) as and when they are needed at the end of your ETL but before a dimension and measure group OLAP process is done. This obviously will need to be approved by your SSAS DBA. I have on the odd occasion found that creating SSAS objects like partitions dynamically through code in a scheduled job, without letting your DBA know, can get you into a little bit of hot water…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hope you find this helpful!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Happy Deving!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;(I have added a zip file to SkyDrive with the sample package. It can be found &lt;a href="http://cid-b8a70ab5e5b19fee.skydrive.live.com/self.aspx/.Public/Analysis%20Services%20Partition%20Creation.zip"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-5100447137408949404?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/5100447137408949404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=5100447137408949404&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/5100447137408949404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/5100447137408949404'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/05/analysis-services-partition-creation-in.html' title='Analysis Services Partition Creation in SSIS'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6013148053952862211</id><published>2009-03-23T13:15:00.001Z</published><updated>2009-03-23T13:15:52.336Z</updated><title type='text'>A very good cause!</title><content type='html'>&lt;p&gt;Please help &lt;a href="http://sqlblogcasts.com/blogs/tsutha/default.aspx"&gt;Sutha&lt;/a&gt; out, if you can. It really is a worthy cause!&lt;/p&gt;  &lt;p&gt;Please visit &lt;a href="http://markhill.org/blog/?p=22"&gt;this blog&lt;/a&gt; of Mark’s for further details.&lt;/p&gt;  &lt;p&gt;Thanks!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6013148053952862211?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6013148053952862211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6013148053952862211&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6013148053952862211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6013148053952862211'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/03/very-good-cause.html' title='A very good cause!'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6811347133005169681</id><published>2009-02-20T12:39:00.001Z</published><updated>2009-02-20T12:39:44.310Z</updated><title type='text'>Exporting to a text file from Reporting Services</title><content type='html'>&lt;p&gt;(Personal Reference)&lt;/p&gt;  &lt;p&gt;A client recently asked me how one could add an export to text file in Reporting Services. I won’t go through the business reasons for this but this is how I suggested they go about it.&lt;/p&gt;  &lt;p&gt;Add the following text:&lt;/p&gt;  &lt;p&gt;&amp;lt;Extension Name=&amp;quot;TXT&amp;quot; Type=&amp;quot;Microsoft.ReportingServices.Rendering.CsvRenderer.CsvReport,Microsoft.ReportingServices.CsvRendering&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;OverrideNames&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Name Language=&amp;quot;en-US&amp;quot;&amp;gt;TXT (Pipe Delimited Text File)&amp;lt;/Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/OverrideNames&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Configuration&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DeviceInfo&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;FieldDelimiter&amp;gt;|&amp;lt;/FieldDelimiter&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Extension&amp;gt;TXT&amp;lt;/Extension&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Encoding&amp;gt;ASCII&amp;lt;/Encoding&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;NoHeader&amp;gt;true&amp;lt;/NoHeader&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/DeviceInfo&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Configuration&amp;gt;     &lt;br /&gt;&amp;lt;/Extension&amp;gt; &lt;/p&gt;  &lt;p&gt;to the SSRS config file, rsreportserver.config, usually located in:&lt;/p&gt;  &lt;p&gt;C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer. The text will need to be included with the other renders in that file between the render tags.&lt;/p&gt;  &lt;p&gt;Happy Deving!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6811347133005169681?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6811347133005169681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6811347133005169681&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6811347133005169681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6811347133005169681'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/02/exporting-to-text-file-from-reporting.html' title='Exporting to a text file from Reporting Services'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-8268845395591361926</id><published>2009-02-20T08:30:00.001Z</published><updated>2009-02-20T08:30:09.440Z</updated><title type='text'>Blogging about blogging…</title><content type='html'>&lt;p&gt;Having recently decided to start blogging again I was on a hunt for a decent blog stat counter. I have used &lt;a href="http://www.statcounter.com/"&gt;StatCounter&lt;/a&gt; in the past but it only allows the last 100 hits (without shelling out fun tokens) to be saved. This was not going to be sufficient to allow for analysis. I was told by a mate to try out &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; and I must say I am very impressed! It allows for all types of analysis and reporting. Go check it out if you are blogging. It is really amazing!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-8268845395591361926?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/8268845395591361926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=8268845395591361926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8268845395591361926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8268845395591361926'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/02/blogging-about-blogging.html' title='Blogging about blogging…'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-4524668127458464499</id><published>2009-02-17T19:03:00.004Z</published><updated>2009-02-17T22:42:11.342Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>Analysis Services Partition Processing</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Recently, while trawling the internet, I noticed that there are not a lot of SSIS examples detailing how to process Analysis Services cubes, especially if you are using Analysis Services partitioning. So I thought I would add an approach I have been using over the last few years.&lt;/p&gt;  &lt;p&gt;While reading this you are probably wondering what all the fuss is about. Why not just use the Analysis Services Processing Task? Well, I guess this is definitely an option when processing dimensions and full cubes or measure groups with small data sets. This task is very useful and does provide a logging framework with a lot of detail. However, it is not dynamic. If the partitioning strategy defined is by month for example and the requirement is to process just those partitions with new data, then a more dynamic approach may be needed.&lt;/p&gt;  &lt;p&gt;This is the scenario for which I am aiming this blog. This approach does add more code and therefore possibly more maintenance but may be a necessity when encountering larger data sets. &lt;/p&gt;  &lt;p&gt;So if we look at the example mentioned above where we are partitioning by month. We could have a measure group with n monthly partitions and a need to process the last two as they could have new data. In this case, we may need a new Analysis Services partition or two which would represent these new months. (I am not going to add the code that creates new partitions in this blog to avoid complexity. I will save this for another blog!) &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In this approach I am going to create the relevant XMLA scripts and then use the SSIS Analysis Services Execute DDL Task to execute them. I have seen many people attempt this approach by creating their own XMLA scripts. However, anyone who has tried this before will agree that the string manipulation required can be a real headache. So having a bit of a development background myself I prefer to allow the AMO (Analysis Management Objects) object model to do the hard work for me. &lt;/p&gt;  &lt;p&gt;So onto the SSIS package…&lt;/p&gt;  &lt;p&gt;First I declare a package variable: strXMLAScript (string) &lt;/p&gt;  &lt;p&gt;Then add a script task and add the following code:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;System, System.Data, System.Math, Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;AMO = Microsoft.AnalysisServices, Microsoft.SqlServer.Management&lt;br /&gt;&lt;span style="color: blue"&gt;Imports &lt;/span&gt;Microsoft.AnalysisServices.QueryBinding&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;Note:&lt;/u&gt; You will need to add the relevant AMO reference to the script task before being able to use it. However, when adding a reference the relevant component i.e. Analysis Management Objects may not be available. This can be made available by coping the Microsoft.AnalysisServices.dll from “\Program Files\Microsoft SQL Server\90\sdk\Assemblies\Microsoft.AnalysisServices.DLL” into the relevant framework folder version e.g. “\windows\Microsoft.NET\Framework\v2.0.50727”.&lt;/p&gt;&lt;p&gt;Then declare script variables and set the task variable for event firing:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;Dim &lt;/span&gt;amoServer &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.Server, amoMeasureGroup &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.MeasureGroup, amoPartition &lt;span style="color: blue"&gt;As &lt;/span&gt;AMO.Partition&lt;br /&gt;&lt;span style="color: blue"&gt;Dim &lt;/span&gt;strXMLAScript &lt;span style="color: blue"&gt;As String&lt;/span&gt;, strTaskName &lt;span style="color: blue"&gt;As String&lt;/span&gt;, oVariables &lt;span style="color: blue"&gt;As &lt;/span&gt;Variables = Dts.Variables&lt;br /&gt;&lt;br /&gt;Dts.VariableDispenser.LockOneForRead(&lt;span style="color: #a31515"&gt;&amp;quot;System::TaskName&amp;quot;&lt;/span&gt;, oVariables)&lt;br /&gt;strTaskName = oVariables.Item(&lt;span style="color: #a31515"&gt;&amp;quot;System::TaskName&amp;quot;&lt;/span&gt;).Value.ToString&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Then initialized the relevant Analysis Services objects: &lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="code"&gt;amoServer = &lt;span style="color: blue"&gt;New &lt;/span&gt;AMO.Server()&lt;br /&gt;amoServer.Connect(&lt;span style="color: #a31515"&gt;&amp;quot;Data Source=LOCALHOST;Initial Catalog=Adventure Works DW;Provider=MSOLAP.3;Integrated Security=SSPI;Impersonation Level=Impersonate;&amp;quot;&lt;/span&gt;)&lt;br /&gt;amoMeasureGroup = amoServer.Databases.FindByName(amoServer.ConnectionInfo.Catalog.ToString).Cubes.FindByName(&lt;span style="color: #a31515"&gt;&amp;quot;Adventure Works&amp;quot;&lt;/span&gt;).MeasureGroups.FindByName(&lt;span style="color: #a31515"&gt;&amp;quot;Reseller Sales&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Then set the server property CaptureXML. (This will make sure that all actions executed against the server during this session will not be implemented but rather that the XMLA for each action is made available.) &lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;amoServer.CaptureXml = &lt;span style="color: blue"&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Once this is done the search criteria for finding the correct partitions will need to be implemented. This will obviously be site specific but I usually name the partitions by measure group and then yyyyMM. So the relevant partitions I am looking for are ResellerSales200901, ResellerSales200902. &lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;' Loop through measure groups partitions&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;For Each &lt;/span&gt;amoPartition &lt;span style="color: blue"&gt;In &lt;/span&gt;amoMeasureGroup.Partitions&lt;br /&gt;    &lt;span style="color: blue"&gt;Select Case &lt;/span&gt;amoPartition.Name.ToUpper&lt;br /&gt;        &lt;span style="color: blue"&gt;Case &lt;/span&gt;amoMeasureGroup.Name.ToUpper &amp;amp; &lt;span style="color: #a31515"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&amp;amp; DateAdd(DateInterval.Month, -1, Now.Date).ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyyMM&amp;quot;&lt;/span&gt;), _&lt;br /&gt;            amoMeasureGroup.Name.ToUpper &amp;amp; &lt;span style="color: #a31515"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&amp;amp; Now.Date.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyyMM&amp;quot;&lt;/span&gt;)&lt;br /&gt;            amoPartition.Process(AMO.ProcessType.ProcessFull) &lt;span style="color: green"&gt;' Could be any process Type required&lt;br /&gt;&lt;br /&gt;            ' Report the partions that have been added to the process list&lt;br /&gt;            &lt;/span&gt;Dts.Events.FireInformation(0, strTaskName, &lt;span style="color: #a31515"&gt;&amp;quot;Added partition - &amp;quot; &lt;/span&gt;&amp;amp; amoPartition.Name &amp;amp; _&lt;br /&gt;                &lt;span style="color: #a31515"&gt;&amp;quot; to process list.&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color: blue"&gt;True&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: blue"&gt;End Select&lt;br /&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Note: Even when the loop is complete, no processing has been done. Only the XMLA script has been captured. Also note that I usually add an information event in the loop so I can easily highlight in my logging framework the partitions that have been added to the process list. I have found this information very useful when debugging.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We are now able to capture the XMLA script that the AMO object model has generated and set the ProcessInTransaction and ProcessInParallel properties as required. The package variable (strXMLAScript) is then populated with the XMLA string .&lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;' Set in transaction and in parallel properties and capture&lt;br /&gt;&lt;/span&gt;strXMLAScript = amoServer.ConcatenateCaptureLog(&lt;span style="color: blue"&gt;True&lt;/span&gt;, &lt;span style="color: blue"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;' Write to package variable&lt;br /&gt;&lt;/span&gt;Dts.VariableDispenser.LockOneForWrite(&lt;span style="color: #a31515"&gt;&amp;quot;User::strXMLAString&amp;quot;&lt;/span&gt;, oVariables)&lt;br /&gt;oVariables.Item(&lt;span style="color: #a31515"&gt;&amp;quot;User::strXMLAString&amp;quot;&lt;/span&gt;).Value = strXMLAScript&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;The AMO server object does allow for the execution on the XMLA script once it has all been captured. This can be done with the following method: &lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;amoServer.ExecuteCaptureLog(&lt;span style="color: blue"&gt;True&lt;/span&gt;, &lt;span style="color: blue"&gt;True&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;However, this will require that you write a lot more code to capture all the possible errors and/or warnings that may occur. I prefer to allow the Analysis Services Execute DDL Task to do all this work for me. It also makes sure that all the relevant events that may need to be captured i.e. Onprogress, OnInformation, OnWarning and OnError are easily captured by your logging framework.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So all that is needed now is the Analysis Services Execute DDL Task source property is set to the variable strXMLA and we are ready to process.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following shows the execution results with all the possible events that could be captured by your logging framework:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_gITDoj6lmfk/SZs7VVthFPI/AAAAAAAAAFE/IAh0fHmg4p4/s1600-h/Package%5B6%5D.jpg"&gt;&lt;img title="Package" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="853" alt="Package" src="http://lh3.ggpht.com/_gITDoj6lmfk/SZs7X1gIznI/AAAAAAAAAFI/ar6GhADx9X4/Package_thumb%5B4%5D.jpg?imgmax=800" width="1011" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is clearly a very simple example but can easily extend to accommodate for most, if not all, of your partition processing needs. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hope you find this helpful!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Deving!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(I have added a zip file to SkyDrive with the sample package and xmla to add the required partitions to the Adventure Works DW Cube. It can be found &lt;a href="http://cid-b8a70ab5e5b19fee.skydrive.live.com/self.aspx/.Public/Analysis%20Services%20Partition%20Processing.zip"&gt;here&lt;/a&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-4524668127458464499?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/4524668127458464499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=4524668127458464499&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4524668127458464499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4524668127458464499'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/02/analysis-services-partition-processing.html' title='Analysis Services Partition Processing'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_gITDoj6lmfk/SZs7X1gIznI/AAAAAAAAAFI/ar6GhADx9X4/s72-c/Package_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-8975284182005806909</id><published>2009-02-03T08:35:00.005Z</published><updated>2009-02-03T08:43:58.821Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogs'/><title type='text'>A new blog</title><content type='html'>An ex colleague and close mate has started a new blog which I have recently added to my Google reader. You can find it &lt;a href="http://www.brettjohnspence.com/"&gt;here&lt;/a&gt;. His opinions and humour definitely require a read!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-8975284182005806909?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/8975284182005806909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=8975284182005806909&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8975284182005806909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8975284182005806909'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2009/02/new-blog.html' title='A new blog'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-3548107253467734758</id><published>2008-08-21T11:23:00.004Z</published><updated>2008-08-21T11:35:23.394Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>Stored Procedure - Parameter sniffing</title><content type='html'>I spent a fair amount of time yesterday on a stored procedure which was performing very badly. Once I had done all the usual checks I decided to run the SQL that was contained in the sp and was very confused to see that it was a lot quicker. The sp was taking over 3 minutes to execute while the SQL query was taking 2 seconds.&lt;br /&gt;&lt;br /&gt;I ended up finding out why from this &lt;a href="http://www.lockergnome.com/sqlsquirrel/2007/12/14/victim-of-parameter-sniffing/"&gt;link&lt;/a&gt; and this &lt;a href="http://groups.google.com/group/microsoft.public.sqlserver.programming/msg/c992528dc5c6d8e4?hl=en&amp;lr&amp;ie=UTF-8&amp;oe=UTF-8"&gt;one&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lets hope this parameter sniffing issue doesn't catch you out for as long as it did me.&lt;br /&gt;&lt;br /&gt;Happy deving!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-3548107253467734758?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/3548107253467734758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=3548107253467734758&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/3548107253467734758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/3548107253467734758'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2008/08/stored-procedure-parameter-sniffing.html' title='Stored Procedure - Parameter sniffing'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-8243244978044522992</id><published>2007-10-19T12:58:00.000Z</published><updated>2007-10-19T12:59:56.237Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rugby'/><title type='text'>The RWC Final</title><content type='html'>It is a huge weekend for South African rugby. Lets hope the guys can hold it together and take the cup home. Go Bokke!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-8243244978044522992?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/8243244978044522992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=8243244978044522992&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8243244978044522992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/8243244978044522992'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/10/rwc-final.html' title='The RWC Final'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-4298292210232749040</id><published>2007-07-27T07:50:00.000Z</published><updated>2007-07-27T08:16:58.951Z</updated><title type='text'>SSIS : Running a package through a SQL Agent Job</title><content type='html'>On the project I am currently working on, I have set up a few of my SSIS packages to execute under a global executor job executed by the SQL Agent. The other evening at closing time a colleague of mine needed to execute this job. He used remote desktop to get onto the relevant server and manually started the job. He then logged off from the server, packed up and went home, happy in the knowledge that the job would be run by the time we returned in the morning. However in the morning we were greeted with a failed job and the following message "The job was stopped prior to completion by (Unknown) "&lt;br /&gt;&lt;br /&gt;After investigating further I found the following explanation :&lt;br /&gt;&lt;br /&gt;http://support.microsoft.com/kb/922527&lt;br /&gt;&lt;br /&gt;A bit of an interesting one. Definitely worth knowing if you are like me and run batch jobs at night and hope to have them completed in the morning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-4298292210232749040?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/4298292210232749040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=4298292210232749040&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4298292210232749040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4298292210232749040'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/07/ssis-running-package-through-sql-agent.html' title='SSIS : Running a package through a SQL Agent Job'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6718544232693390827</id><published>2007-04-25T09:51:00.000Z</published><updated>2007-04-25T10:06:14.269Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS : Package Configurations</title><content type='html'>&lt;p&gt;There are many advantages to setting up configurations for your SSIS packages. If you have configuration values set up throughout your packages you can avoid unnecessary retesting and deployment processes later on. It also makes the process of redeploying to multiple environments (Dev, UAT, SysTest, and Prod) a lot easier. &lt;br&gt;&lt;br&gt;On a recent project my colleagues and I decided that it would be very useful to implement package configurations in our SSIS packages. After a little bit of investigation we realised that the out-of-the-box package configuration although useful would not provide us with what we required. &lt;br&gt;&lt;br&gt;Our requirements were as follows: &lt;br&gt;&lt;br&gt;• Multiple filtering options - Because a package can be used in multiple systems and multiple environments (Development, UAT, Production)&lt;br&gt;• System and Package variable - Some variables (e.g. warehouse connection string) maybe system wide variables whereas some may be unique for a specific package.&lt;br&gt;• Encryption of Sensitive Information- Some of the variables may contain sensitive information that we wanted to have encrypted in the database.&lt;br&gt;• Config Audit Log - An audit log of what configuration values were during the time the package executed.&lt;br&gt;• Config Audit Trail - An audit trail of who has changed the config values&lt;br&gt;• Simple implementation - an easy way to implement the config process throughout all existing and future packages. &lt;br&gt;&lt;br&gt;Database&lt;br&gt;I am sure most SSIS implementation use an Audit database of some kind to capture package and task execution logs. (See a future blog on SSIS logging) This is a good place to store your configuration information as it goes hand-in-hand with your logging information. &lt;br&gt;&lt;br&gt;As we are storing this information in a database which can be moved between servers with varying users it is advisable to have its connection string being set up using the out of the box SSIS configuration functionality. &lt;br&gt;&lt;br&gt;The database contains configuration tables i.e. PackageConfig, PackageAudit, PackageConfigLog. The PackageConfig table contains information uniquely defining each package through it’s package GUID and each of the package variables, variable types and variable values along with a flag whether the value should be encrypted or not. You should also include multiple columns for filtering your configuration values by i.e. System, Environment and Warehouse Process etc. The PackageAudit table contains all the necessary columns from the PackageConfig table that need to be audited as well a column for the user who made the change and the time of the change. This table has a trigger that will add a new row to the audit table whenever the main table is added to or changed. The PackageConfigLog will contain the necessary columns from the PackageConfig table that will allow the administrator to see which configuration values were used during each execution. Trust me, without this table you can be testing and get unusual results, take many hours hunting down what you might have done wrong and in the end find out that one of you colleagues change a config value that was vital to your test. If you had checked this table first, life could have been a lot less painful. &lt;br&gt;&lt;br&gt;SSIS&lt;br&gt;Inside you package you will need a task to overwrite the variable values as defined in the package. You may want to write a custom task for this or just use a script task. As this is a task that will be used in all you packages I would suggest using the custom task options as changes to the script once it has been implemented in 100s of packages can be a real nightmare. &lt;br&gt;&lt;br&gt;I have included a simplified version of the code below &lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7745c005-631a-48e2-a800-105b1069cb4a" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; open connection&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;oSQLConn &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SqlConnection(strConnectionString) : oSQLConn.Open()&lt;br /&gt;oSQLComm &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SqlCommand(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;uspGetConfigInfo&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, oSQLConn)&lt;br /&gt;oSQLComm.CommandType &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; CommandType.StoredProcedure &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Add parameters to SQL command&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Call&lt;/span&gt;&lt;span style="color: #000000; "&gt; ParametersGetConfig() &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Execute and return dataset&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;oSQLReader &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLComm.ExecuteReader() &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through reader&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;While&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLReader.Read&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; Dts.VariableDispenser.Contains(oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Lock variable for write&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Dts.VariableDispenser.LockOneForWrite(oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString, oVariables) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Check variable is the correct type&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; oVariables.Item(oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString).DataType.ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;2&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;oVariables.Item(oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString).Value &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; Convert.ChangeType(oSQLReader.GetValue(&lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;), _&lt;br /&gt;oVariables.Item(oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString).DataType) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Report information&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Dts.Events.FireInformation(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, strComponent, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;The variable - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; has been updated.&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, _&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;True&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Else&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Report incorrect data type&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Dts.Events.FireWarning(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, strComponent, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;The variable - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; has a different data type then &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; _&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;that defined in the config database.&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Else&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Report missing variable&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Dts.Events.FireWarning(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, strComponent, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;The variable - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSQLReader.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;).ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; is missing.&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;While&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Close SQL Data Reader&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;oSQLReader.Close() &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;A stored procedure (uspGetConfigInfo) will get the variable information from the table discussed earlier and find the relevant variables, verify that the variable type are correct and then replace the value in the package. The change will be reported to the package through the component event namespace and can be captured by your chosen logging mechanism in the OnInformation event handler. The config log information could be implemented using a similar process in which the valid variables (with the correct data type) are written away to the PackageConfigLog table. &lt;br&gt;&lt;br&gt;Encryption: &lt;br&gt;Using SQL Server encryption you can encrypt variable values in your PackageConfig table and decrypt them in your GetConfigValues stored procedure. Ensure that these values are not written to the package config log as that would obviously ruin the whole purpose of the encryption process.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6718544232693390827?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6718544232693390827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6718544232693390827&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6718544232693390827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6718544232693390827'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/02/ssis-package-configurations.html' title='SSIS : Package Configurations'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-647440317671283286</id><published>2007-04-18T09:54:00.000Z</published><updated>2007-04-18T09:59:56.481Z</updated><title type='text'>Hall shines in Barbados</title><content type='html'>What an amazing spell of bowling from Andrew Hall Yesterday! The most underrated player in South African Cricket showing his stuff. Good on you mate, good on you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-647440317671283286?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/647440317671283286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=647440317671283286&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/647440317671283286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/647440317671283286'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/04/hall-shines-in-barbados.html' title='Hall shines in Barbados'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-7299866357198796710</id><published>2007-03-29T10:02:00.000Z</published><updated>2007-03-29T15:13:16.681Z</updated><title type='text'>It has been a while!</title><content type='html'>Wow, it has been a long time since I lasted blogged. Apologies for that but I have been on holiday in Cape town. While sitting on the beach getting a healthy dose of sun, sea and sand the geek in me was thinking what my next few blogs should involve. &lt;br /&gt;&lt;br /&gt;After a second or two of thought I decided that the folowing would be nice to share :&lt;br /&gt;&lt;br /&gt;1) SSIS : Package Configurations&lt;br /&gt;2) SSIS : Package and Task logging &lt;br /&gt;3) SSIS : Creating and processing Analysis Services partitions&lt;br /&gt;4) SSMS : A sample SSMS addin&lt;br /&gt;&lt;br /&gt;So while I get hard to work on these I hope you will occassionally check in to see my progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-7299866357198796710?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/7299866357198796710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=7299866357198796710&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/7299866357198796710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/7299866357198796710'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/03/it-has-been-while.html' title='It has been a while!'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-4993932309244368026</id><published>2007-02-12T17:31:00.000Z</published><updated>2007-02-12T17:38:35.349Z</updated><title type='text'>SSMS: T-SQL Intellisense Addins (Feedback)</title><content type='html'>After trying SQLAssist for a short while now, I have decided to removed it from my machine. I found it nice to work with but a lot of the time it would hang SSMS for few seconds. This afternoon while writing a query I hit Ctrl-F and it froze SSMS. Very annoying when you are in the middle of some hardcore development. &lt;br /&gt;&lt;br /&gt;SQL Prompt is now priced at $195 which to me seems a little excessive. Oh well will have to carry on using my work around. I will place it here soon when I have created an installation package for it. Don't panic, my slap together version will definitely be free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-4993932309244368026?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/4993932309244368026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=4993932309244368026&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4993932309244368026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4993932309244368026'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/02/ssms-t-sql-intellisense-addins-feedback.html' title='SSMS: T-SQL Intellisense Addins (Feedback)'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-2375511441294830063</id><published>2007-02-08T13:42:00.001Z</published><updated>2007-02-08T17:22:54.092Z</updated><title type='text'>SSIS : Writing to the event log</title><content type='html'>&lt;p&gt;I recently had a discussion with a collegue of mine on how to write information to the event log. If you have tried this before you will see that the DTS.Event.FireError will write an error to the eventlog but the other events (Onwarning, OnInformation) won't. This can be a bit of a headache if you have any application that uses the Eventlog for notifications. To get over this hurdle I would suggest you add a script component to the event you are trying to capture and add the following code to it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:bf52cd0c-5a9a-43d7-8044-4b3f2e0eedb9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System, System.Diagnostics, System.Data, System.Math, Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Must Include System.Diagnostics&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ScriptMain&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main()&lt;br /&gt;&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Write whatever message you want. You may need to investigate what eventID you will use&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;         EventLog.WriteEntry(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Your Source&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Warning the database has gone off line&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, EventLogEntryType.Warning, &lt;/span&gt;&lt;span style="color: #000000; "&gt;1001&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Report Error&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;        Dts.TaskResult &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; Dts.Results.Success&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; DtsException&lt;br /&gt;&lt;br /&gt;              Dts.Events.FireError(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CInt&lt;/span&gt;&lt;span style="color: #000000; "&gt;(ex.ErrorCode), Dts.Variables(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;System::TaskName&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Value.ToString, ex.Message.ToString, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note:&lt;/u&gt;&lt;/strong&gt; You will need to add the the System.Diagnostics namespace to make this work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-2375511441294830063?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/2375511441294830063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=2375511441294830063&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2375511441294830063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/2375511441294830063'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/02/ssis-writing-to-event-log.html' title='SSIS : Writing to the event log'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-970166396349274822</id><published>2007-01-11T14:38:00.000Z</published><updated>2007-01-11T22:07:47.254Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSMS'/><title type='text'>SSMS: T-SQL Intellisense Addins</title><content type='html'>I have had my eye on a few of the T-SQL Intellisense applications that have shown up since microsoft excluded intellisense from the T-SQL part of the Texteditor in SSMS after beta 1 of Sql Server 2005. I even went so far as to having a bash at creating one of my own (I will include my own attempts in a future blog - for anyone who might be interested). I have had a look at &lt;a href="http://www.red-gate.com/products/SQL_Prompt/index.htm"&gt;SQLPrompt&lt;/a&gt;, albeit version 2 (I hear a version 3 is due for release soon) and I found it too annoying to work with on an everyday basis. The biggest problem was that it kept on trying to authenticate which drove me a little crazy. Yesterday I decided to download the beta of &lt;a href="http://www.roundpolygons.com/Default.aspx?tabid=94"&gt;SQLAssist&lt;/a&gt; (SSMS) and have been suitably impressed so far. One of my colleagues thinks it is "The Nuts" but I am not prone to handing out such glowing compliments until I have had a better look at it. So I will be working with it for the next week or so and will report back on what I think and maybe include some of the features I have found to be very useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-970166396349274822?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/970166396349274822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=970166396349274822&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/970166396349274822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/970166396349274822'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/01/ssms-t-sql-intellisense-addins.html' title='SSMS: T-SQL Intellisense Addins'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-763960977498618520</id><published>2007-01-10T17:33:00.000Z</published><updated>2007-02-08T17:25:47.527Z</updated><title type='text'>SSIS : Creating an error output from a script component</title><content type='html'>I recently had the need to create an error output from a script component and thought I would create a blog to explain how easily it can be done.&lt;br&gt;&lt;br&gt;I have created a simple data flow with a OLEDB source that uses SalesAmount and DiscountAmount from the AdventureWorksDW FactResellerSales Table as source inputs. I choice these columns as Discount has values with zeros in it and I wanted to force a divide by zero error. The data flows into the Script component, it then divides the two columns and redirects the errors to the Error Rowcount destination. The non error rows are directed to the valid rows Rowcount destination.&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_gITDoj6lmfk/RaVWqTJ3iEI/AAAAAAAAAB4/SLjvw9hc_6o/s1600-h/DataFlowView.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018512644470442050" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://4.bp.blogspot.com/_gITDoj6lmfk/RaVWqTJ3iEI/AAAAAAAAAB4/SLjvw9hc_6o/s400/DataFlowView.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;When you first create a script component as a transformation, it defaults to having a single input and single output. For this example I have added an extra script output (ErrorRows) and renamed the existing script output to ValidRows. I added an Outputcolumn to the ErrorRows script output called ErrorDescription. I then changed the SynchronousInput property of both script outputs to the script input's ID property. I also changed the two script output ExclusionGroup properties to be 1. &lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_gITDoj6lmfk/RaVfxDJ3iHI/AAAAAAAAACc/aU5i1t5nfDs/s1600-h/ScriptProperties.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018522656039209074" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://3.bp.blogspot.com/_gITDoj6lmfk/RaVfxDJ3iHI/AAAAAAAAACc/aU5i1t5nfDs/s400/ScriptProperties.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The rest is made easy with the following code:&lt;br&gt;&lt;font color="#0000ff" size="2"&gt; &lt;p&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/p&gt; &lt;p&gt;&lt;/font&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7cb5d458-57f2-4d6a-91ad-96e915ceb9d9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System, System.Data, System.Math, Microsoft.SqlServer.Dts.Pipeline.Wrapper, Microsoft.SqlServer.Dts.Runtime.Wrapper&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ScriptMain&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Inherits&lt;/span&gt;&lt;span style="color: #000000; "&gt; UserComponent&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Overrides&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; Input_ProcessInputRow(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; Row &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; InputBuffer)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            Row.SalesWithoutDiscount &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CDec&lt;/span&gt;&lt;span style="color: #000000; "&gt;(Row.SalesAmount) &lt;/span&gt;&lt;span style="color: #000000; "&gt;/&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CDec&lt;/span&gt;&lt;span style="color: #000000; "&gt;(Row.DiscountAmount)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Redirect rows toward valid row output&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            Row.DirectRowToValidRows()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Capture error description&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            Row.ErrorDescription &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex.Message.ToString&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Redirect rows toward error row output&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            Row.DirectRowToErrorRows()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_gITDoj6lmfk/RaVcoTJ3iGI/AAAAAAAAACQ/M3Hk5O0s7Ak/s1600-h/ScriptProgress.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018519207180470370" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://4.bp.blogspot.com/_gITDoj6lmfk/RaVcoTJ3iGI/AAAAAAAAACQ/M3Hk5O0s7Ak/s400/ScriptProgress.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The Data Viewers show the progress when the package is executed. The errors have been redirected to the Error Rows Row Count Destination. The ErrorDescription output column has been populated with the Error Message - "Attempted to Divide By Zero." as expected.&lt;br&gt;&lt;br&gt;This can be greatly extended to have multpile output all being directed to the destinations of your choice. I, however, always include one output that will deal with any error rows that may result from the script component.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-763960977498618520?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/763960977498618520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=763960977498618520&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/763960977498618520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/763960977498618520'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/01/ssis-creating-error-output-from-script.html' title='SSIS : Creating an error output from a script component'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gITDoj6lmfk/RaVWqTJ3iEI/AAAAAAAAAB4/SLjvw9hc_6o/s72-c/DataFlowView.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6020685790615965768</id><published>2007-01-08T21:40:00.000Z</published><updated>2007-01-08T22:17:34.244Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cricket'/><title type='text'>Will Vaughan Make a Difference?</title><content type='html'>The Question has to be: Will Michael Vaughan make any difference to England's current run of bad results. Vaughans personal form in ODIs is not great, averaging a mere 28.36 and Englands form in ODIs over the last year has been pretty pathetic. So I predict that he won't make any difference for the one day series in Aus and the world cup i.e. no semi for England. However the Test scene is definitely his saving grace. England play West Indies and then India at home. Both teams are known to be bad tourists especially in England and they are going to make Vaughan's year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6020685790615965768?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6020685790615965768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6020685790615965768&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6020685790615965768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6020685790615965768'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/01/will-vaughan-make-difference.html' title='Will Vaughan Make a Difference?'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-431601379349723664</id><published>2007-01-08T17:38:00.000Z</published><updated>2007-02-08T17:11:56.627Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS: Event Firing within Script Tasks</title><content type='html'>&lt;p&gt;When using the Script component is SSIS, I have noticed that alot of people don't take advantage of the IDTSComponentEvents Interface in the DTS namespace. This interface allows for event firing. All the existing tasks use this interface to fire the events required during their execution. Standard events include OnError, OnWarning, OnInformation and OnProgress. The Script Task can use this interface to easily portray to the Progress Tab, SSIS Logging or the EventHandler exactly what is happening in the script. I include it in all my script tasks for error handling but it can be used alot more extensively depending on the complexity. For instances showing the progress as you loop through items in a collection. &lt;br&gt;&lt;br&gt;The first thing to do when setting this up is to add the System variable TaskName to the ReadOnly variables collection list. &lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_gITDoj6lmfk/RaKz1H7U2BI/AAAAAAAAAA8/_0Ko2jME81k/s1600-h/ScriptComponent.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5017770660086470674" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://1.bp.blogspot.com/_gITDoj6lmfk/RaKz1H7U2BI/AAAAAAAAAA8/_0Ko2jME81k/s400/ScriptComponent.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The Code will look as follows :&lt;br&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3397697e-41e1-4913-ba3c-0ec5dcc5e0dd" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 1037px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System, System.Data, System.Math, Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ScriptMain&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; SubComponent &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get local instances of variables collection&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oVars &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Variables &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; Dts.Variables&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get Task name&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            SubComponent &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oVars.Item(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;System::TaskName&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Value.ToString&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop abb 10 times&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;10&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                Dts.Events.FireProgress(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;My Message : Wow look at me go!&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, i &lt;/span&gt;&lt;span style="color: #000000; "&gt;*&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;10&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SubComponent, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;True&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Express loop success&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            Dts.Events.FireInformation(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SubComponent, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Looping Succeeded&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;True&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Show Error&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            Dts.Events.FireError(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SubComponent, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;This would be my error!&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            Dts.TaskResult &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; Dts.Results.Success&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; exDTS &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; DtsException&lt;br /&gt;            Dts.Events.FireError(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CInt&lt;/span&gt;&lt;span style="color: #000000; "&gt;(exDTS.ErrorCode), SubComponent, exDTS.Message.ToString, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;            Dts.Events.FireError(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SubComponent, ex.Message.ToString, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Empty, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br&gt;SSIS shows the progress as :&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gITDoj6lmfk/RaORjkH1DMI/AAAAAAAAABs/REy99rTJ0qo/s1600-h/ScriptProgress.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018014449998826690" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://1.bp.blogspot.com/_gITDoj6lmfk/RaORjkH1DMI/AAAAAAAAABs/REy99rTJ0qo/s400/ScriptProgress.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;These events can also be captured by SSIS logging or the SSIS event handler.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-431601379349723664?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/431601379349723664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=431601379349723664&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/431601379349723664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/431601379349723664'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2007/01/ssis-logging-within-script-tasks.html' title='SSIS: Event Firing within Script Tasks'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gITDoj6lmfk/RaKz1H7U2BI/AAAAAAAAAA8/_0Ko2jME81k/s72-c/ScriptComponent.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-6759281330923458259</id><published>2006-12-16T14:29:00.000Z</published><updated>2007-02-08T17:31:14.285Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS Macros - Part 3 : Get Task Event Handlers</title><content type='html'>&lt;p&gt;Anyone who has been using SSIS for a reasonable amount of time will probably be very familiar with SSIS event handlers. I have found this to be a very useful feature and it always one to avoid the spider web nightmare that can occur when you are trying to capture each task's error and end up having a failure constraint coming from each of them.&lt;br&gt;&lt;br&gt;However when using events one has to be careful at which level you handle them. If you use the OnError event at the package level and the task level, and the task fails, you will notice that the event will fire twice due to the fact that events bubble up from each task to their container. This can easily be overcome by setting the task system variable &lt;span style="font-weight: bold"&gt;propogate&lt;/span&gt; in the event handler to &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;. However whenever you are developing a complex task or have need to edit one, it is difficult without a lot of clicking to find out which tasks have event handler, which have progate set to false and which are being handled at the container or package level.&lt;br&gt;&lt;br&gt;Once again, I thought this would be an ideal time to write a quick macro that would allow me to see the event handler information for more complex packages.&lt;br&gt;&lt;br&gt;Here is what is displayed by the macro I use:&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_gITDoj6lmfk/RaauvDJ3iII/AAAAAAAAACo/NWJ6r4X3PYA/s1600-h/ErrorHandlersProgress.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018890958074775682" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://4.bp.blogspot.com/_gITDoj6lmfk/RaauvDJ3iII/AAAAAAAAACo/NWJ6r4X3PYA/s400/ErrorHandlersProgress.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Below is a sample of the code I used to get this information:&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e2bd143d-fa8b-4a53-92ad-8debea82ef7a" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSSISApp &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Application, oPackage &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Package, oTaskHost &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.TaskHost&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Executable, oEventHandler &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.DtsEventHandler, oContainer &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Object&lt;/span&gt;&lt;span style="color: #000000; "&gt;, i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt;, j &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get package object&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            oPackage &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSSISApp.LoadPackage(DTE.ActiveDocument.FullName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;            frm.gbPackage.Text &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Name.ToString&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through events in the package&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oEventHandler &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.EventHandlers&lt;br /&gt;                frm.lvwEventHandler.Items.Add(frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;                i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                frm.lvwEventHandler.Items(i).SubItems.Add(oPackage.GetType.Name.ToString)&lt;br /&gt;                frm.lvwEventHandler.Items(i).SubItems.Add(oPackage.Name.ToString)&lt;br /&gt;                frm.lvwEventHandler.Items(i).SubItems.Add(oPackage.EventHandlers.Count.ToString)&lt;br /&gt;                frm.lvwEventHandler.Items(i).SubItems.Add(oEventHandler.Name.ToString)&lt;br /&gt;                frm.lvwEventHandler.Items(i).SubItems.Add(oEventHandler.Variables.Item(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Propagate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Value.ToString)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through executables in package&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Executables&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Check that the executable is a task&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec.GetType.Name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TaskHost&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Set the SSIS type&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                    oTaskHost &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CType&lt;/span&gt;&lt;span style="color: #000000; "&gt;(oExec, SSIS.TaskHost)&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; If no events&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; oTaskHost.EventHandlers.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                        frm.lvwEventHandler.Items.Add(frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;                        i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                        frm.lvwEventHandler.Items(i).SubItems.Add(oExec.GetType.Name.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(i).SubItems.Add(oTaskHost.Name.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(i).SubItems.Add(oTaskHost.EventHandlers.Count.ToString)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through event handlers&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oEventHandler &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oTaskHost.EventHandlers&lt;br /&gt;                        frm.lvwEventHandler.Items.Add(frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;                        j &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; frm.lvwEventHandler.Items.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                        frm.lvwEventHandler.Items(j).SubItems.Add(oExec.GetType.Name.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(j).SubItems.Add(oTaskHost.Name.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(j).SubItems.Add(oTaskHost.EventHandlers.Count.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(j).SubItems.Add(oEventHandler.Name.ToString)&lt;br /&gt;                        frm.lvwEventHandler.Items(j).SubItems.Add(oEventHandler.Variables.Item(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Propagate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Value.ToString)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br&gt;I hope some will find benefit from this, I definitely have.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-6759281330923458259?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/6759281330923458259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=6759281330923458259&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6759281330923458259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/6759281330923458259'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2006/12/ssis-macros-part-3-get-task-event.html' title='SSIS Macros - Part 3 : Get Task Event Handlers'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gITDoj6lmfk/RaauvDJ3iII/AAAAAAAAACo/NWJ6r4X3PYA/s72-c/ErrorHandlersProgress.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-9202666332774567502</id><published>2006-12-14T14:11:00.000Z</published><updated>2007-02-08T17:57:00.630Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS Macros - Part 2 : Get Tasks Without Descriptions</title><content type='html'>&lt;p&gt;When using SSIS logging or the SSIS Event Handlers to get which tasks have fired and what their results were, I have found that it is very handy to have a good description for each task that is being used in each package.&lt;br&gt;&lt;br&gt;The few SSIS documenting tools I have seen all take advantage of these descriptions and therefore the benefits of using them greatly outway the effort it takes to define them. However, once your package becomes more complex it can be tedous to have to go to each task click on it, then find the description property in the properties window to see if you remembered to edit the description or not. To ensure that I didn't pull anymore hair out of my head due to this this mundane process, I slapped together a simple macro that will run through a package and see if the Task and Component Descriptions are blank or are still set to the the default. &lt;br&gt;&lt;br&gt;Here is a result of the macro :&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_gITDoj6lmfk/RaayYzJ3iJI/AAAAAAAAAC0/AuSci0HLA5s/s1600-h/ObjectDescriptions.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5018894973869197458" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://3.bp.blogspot.com/_gITDoj6lmfk/RaayYzJ3iJI/AAAAAAAAAC0/AuSci0HLA5s/s400/ObjectDescriptions.JPG" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Below is a sample of the code I used to get this information:&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6d233670-dc5d-41a2-9fd9-392c26347168" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 1138px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; GetObjectDescriptions(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; frm &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; frmObjectDescriptions)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSSISApp &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Application, oPackage &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Package, oTaskHost &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.TaskHost&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Executable, oEventHandler &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.DtsEventHandler&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oMainPipe &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; MainPipe&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get package object&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            oPackage &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oSSISApp.LoadPackage(DTE.ActiveDocument.FullName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            frm.gbPackage.Text &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Name&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt;Loop through executables in package&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Executables&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec.GetType.Name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TaskHost&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Set the SSIS type&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                    oTaskHost &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CType&lt;/span&gt;&lt;span style="color: #000000; "&gt;(oExec, SSIS.TaskHost)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oNode &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; TreeNode &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; frm.tvwObjects.Nodes.Add(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Task - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; oTaskHost.Name.ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; _&lt;br /&gt;                    CheckTaskDesc(oSSISApp, oTaskHost.Description.ToString))&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; TODO : Find out how to check if it is a data flow or not&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                        oMainPipe &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CType&lt;/span&gt;&lt;span style="color: #000000; "&gt;(oTaskHost.InnerObject, MainPipe)&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through components&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; oMainPipe.ComponentMetaDataCollection.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                            oNode.Nodes.Add(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Dataflow - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; oMainPipe.ComponentMetaDataCollection.Item(i).Name.ToString &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; - &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; _&lt;br /&gt;                            CheckPipeCompDesc(oSSISApp, oMainPipe.ComponentMetaDataCollection.Item(i).Description.ToString))&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;            MessageBox.Show(ex.Message.ToString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Finally&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br&gt;If you are like me and have seen the benefit of having these descriptions defined and want to avoid the headache this process can cause I would recommend take a bit of time to set this up. Your receding hairline will thank you as mine did.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-9202666332774567502?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/9202666332774567502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=9202666332774567502&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/9202666332774567502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/9202666332774567502'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2006/12/ssis-macros-part-2-get-tasks-without.html' title='SSIS Macros - Part 2 : Get Tasks Without Descriptions'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gITDoj6lmfk/RaayYzJ3iJI/AAAAAAAAAC0/AuSci0HLA5s/s72-c/ObjectDescriptions.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-4407766291141407807</id><published>2006-12-14T14:05:00.000Z</published><updated>2007-01-11T21:43:02.034Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cricket'/><title type='text'>Ashes - 3rd Test (Perth) : Day 1 Prediction</title><content type='html'>Well I guess that answers the Monty question. A very confincing argument for a tight test match. I, however, believe it doesn't matter, unless England score 550 in the first innings the Aussies will still take this one with a fiver from Warnie in the 2nd innings!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-4407766291141407807?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/4407766291141407807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=4407766291141407807&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4407766291141407807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/4407766291141407807'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2006/12/egg-on-his-face.html' title='Ashes - 3rd Test (Perth) : Day 1 Prediction'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5733427176767844093.post-3363259127768785921</id><published>2006-12-14T13:26:00.000Z</published><updated>2007-02-19T11:38:01.822Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS Macros - Part 1 : Reset Task IDs</title><content type='html'>&lt;p&gt;As a first blog and seeing that I have found myself doing alot of just SSIS development on my current project, I thought I would share a few nice-to-have visual studio 2005 macros I have been using that have made my SSIS development alot easier.&lt;br&gt;&lt;br&gt;The macro for this post involves resetting Task/Container Guids in SSIS packages. For those who don't know, each Task or Container in an SSIS package will have an ID propery. This ID property is a unique GUID which uniquely identifies the object. So if you are using SSIS logging or some kind of logging through the event handlers you find that using these GUIDs can be very helpful in logging and auditing the tasks in all your packages.&lt;br&gt;&lt;br&gt;However, one of the problems that may arise by using these IDs is that if you copy and paste a task into a different container (Loop or Sequence) or package the Task ID will remain the same as the source one that you copied. Therefore it will not uniquely identity that task in the package (if it exists in different containers) or in the packages of the SSIS project. This can be a real headache when you are trying to find which task caused an error or executed for a certain period of time.&lt;br&gt;&lt;br&gt;If you are copying and pasting packages the same problem will occur. However, it is easy to overcome by using "Generate New ID" through the ID property of the package. This is not as easy when dealing with tasks. &lt;br&gt;&lt;br&gt;The macro I have included in this post will reset all the task GUIDs in a package.&lt;br&gt;All it does is use the SSIS object model to loop through all the tasks inside a given package, find the tasks ID and then do a find and replace in the packages XML. &lt;br&gt;&lt;br&gt;&lt;strong&gt;Note:&lt;/strong&gt; Be aware that the macro will save the package after the IDs have been reset, so do not run it if you do not want other changes you have made to the package to be saved.&lt;br&gt;&lt;br&gt;I have included sample code that will help you get started writing your own macros. This code will only reset IDs for tasks, so you will need to add your own code for containers.&lt;br&gt;&lt;br&gt;Note: The object model sees each container (sequence and loop) or package as having a collection of tasks. Therefore if you want to reset all the guids you will have to write code to loop through the package, the containers and all nested containers.&lt;br&gt;&lt;br&gt;Source Code: &lt;br&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2ac13312-5801-496e-841f-1171ea3ccc71" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 1080px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; ResetGuids()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oApp &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Application&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Executable, taskHost &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.TaskHost&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, gdNewGuid &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Guid&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get package path&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Package &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oApp.LoadPackage(DTE.ActiveDocument.FullName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through tasks&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Executables&lt;br /&gt;                taskHost &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;CType&lt;/span&gt;&lt;span style="color: #000000; "&gt;(oExec, SSIS.TaskHost)&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Store task Guids in an array&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Set value and grow array size&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)) &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; taskHost.ID&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ReDim&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Preserve&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Edit package XML &lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            DTE.ExecuteCommand(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;View.ViewCode&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through task GUIDS in the array&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                DTE.Find.FindWhat &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(i).ToString&lt;br /&gt;                DTE.Find.ReplaceWith &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;{&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Guid.NewGuid.ToString.ToUpper &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;}&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Set find criteria&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                DTE.Find.Target &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindTarget.vsFindTargetCurrentDocument&lt;br /&gt;                DTE.Find.MatchCase &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;False&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.MatchWholeWord &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;True&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.MatchInHiddenText &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;False&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.Action &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindAction.vsFindActionReplaceAll&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; (DTE.Find.Execute() &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindResult.vsFindResultNotFound) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;MsgBox&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;No values were found&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            DTE.ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo)&lt;br /&gt;            DTE.ActiveDocument.Save()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;MsgBox&lt;/span&gt;&lt;span style="color: #000000; "&gt;(ex.Message.ToString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;-- Updated on the 16 Feb 2007 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The previous sample only looped through tasks in the package i.e. not tasks in sequence or loop containers. Here is a sample that will capture all IDs for all tasks and containers. This sample will recursively loop through all the package objects.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d2617309-f655-4c39-94c0-82abe61be172" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; ResetsEachExecutablesGuid()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oApp &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Application, aszTaskID(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Executable, taskHost &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.TaskHost&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; gdNewGuid &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Guid, SSISObject &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Object&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Get package path&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Package &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oApp.LoadPackage(DTE.ActiveDocument.FullName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through tasks&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oPackage.Executables&lt;br /&gt;                SSISObject &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec.GetType.Name.ToLower &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;taskhost&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Call&lt;/span&gt;&lt;span style="color: #000000; "&gt; LoopThroughContainer(SSISObject, aszTaskID)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Capture Task IDs&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)) &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSISObject.ID&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ReDim&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Preserve&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Edit package XML &lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            DTE.ExecuteCommand(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;View.ViewCode&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Loop through task ids captured&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                DTE.Find.FindWhat &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(i).ToString&lt;br /&gt;                DTE.Find.ReplaceWith &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;{&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Guid.NewGuid.ToString.ToUpper &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;}&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Set find criteria&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;                DTE.Find.Target &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindTarget.vsFindTargetCurrentDocument&lt;br /&gt;                DTE.Find.MatchCase &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;False&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.MatchWholeWord &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;True&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.MatchInHiddenText &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;False&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                DTE.Find.Action &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindAction.vsFindActionReplaceAll&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; (DTE.Find.Execute() &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vsFindResult.vsFindResultNotFound) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;MsgBox&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;No values were found&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            DTE.ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo)&lt;br /&gt;            DTE.ActiveDocument.Save()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Catch&lt;/span&gt;&lt;span style="color: #000000; "&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Exception&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;MsgBox&lt;/span&gt;&lt;span style="color: #000000; "&gt;(ex.Message.ToString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Try&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; LoopThroughContainer(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; oContainer &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Object, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID() &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSIS.Executable, SSISObject &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Object&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Each&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;In&lt;/span&gt;&lt;span style="color: #000000; "&gt; oContainer.Executables&lt;br /&gt;            SSISObject &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; oExec&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSISObject.GetType.Name.ToLower &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;taskhost&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Call&lt;/span&gt;&lt;span style="color: #000000; "&gt; LoopThroughContainer(SSISObject, aszTaskID)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt; Capture Task IDs&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;            aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)) &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; SSISObject.ID&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ReDim&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Preserve&lt;/span&gt;&lt;span style="color: #000000; "&gt; aszTaskID(aszTaskID.GetUpperBound(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Function&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5733427176767844093-3363259127768785921?l=colinkirkby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://colinkirkby.blogspot.com/feeds/3363259127768785921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733427176767844093&amp;postID=3363259127768785921&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/3363259127768785921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733427176767844093/posts/default/3363259127768785921'/><link rel='alternate' type='text/html' href='http://colinkirkby.blogspot.com/2006/12/ssis-macros-part-1.html' title='SSIS Macros - Part 1 : Reset Task IDs'/><author><name>Colin Kirkby</name><uri>http://www.blogger.com/profile/16123837105057950772</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
