<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkAGRXc8cSp7ImA9WhVTEE4.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580</id><updated>2012-02-23T14:05:24.979-08:00</updated><category term="Integration Services (SSIS)" /><category term="SSIS Scripting" /><category term="How To" /><category term="Performance" /><category term="Derived Column Transformation" /><category term="Package Configurations" /><category term="PerformUpgrade" /><category term="Microsoft SQL Server" /><category term="Business Intelligence" /><category term="Analysis Services (SSAS)" /><category term="Kimball" /><category term="Best Practice" /><category term="SQLServerCentral Syndication" /><category term="UnSQL Friday" /><category term="Business Value" /><category term="Community" /><category term="Visual Basic" /><category term="Administrivia" /><category term="SQLSaturday" /><category term="MS Connect" /><category term="Certifications" /><category term="SSIS Component Validation" /><category term="Virtualization" /><category term="ReinitializeMetaData" /><category term="Quick Reference" /><category term="SSIS Custom Objects" /><category term="Parallelism" /><category term="Off-Topic Rants" /><category term="Quick Hit" /><category term="Microsoft Office" /><category term="Dimension Merge SCD Internals" /><category term="Microsoft Excel" /><category term="SharePoint" /><category term="PASS Summit" /><category term="Calculated Measures" /><category term="Extract Transform Load (ETL)" /><category term="Presentations" /><category term="NoSQL" /><category term="PASS" /><category term="SSIS Control Flow" /><category term="Guerilla BI" /><category term="Windows Phone 7" /><category term="Data Access" /><category term="Microsoft Access" /><category term="SSIS Data Flow" /><category term="MSBIC" /><category term="SQLServerPedia Syndication" /><category term="Data Warehousing" /><category term="Reporting Services (SSRS)" /><category term="Network Infrastructure" /><category term="Dimension Merge SCD" /><category term="CodePlex" /><category term=".Net Framework" /><category term="Looking Forward" /><category term="Database Design" /><title>Todd McDermid's Blog</title><subtitle type="html">Posts about SQL Server, Data Warehousing, Integration Services, .Net Development, and other tools of the trade</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://toddmcdermid.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>143</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ToddMcdermidsBlog" /><feedburner:info uri="toddmcdermidsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><entry gd:etag="W/&quot;C0IDSH8yfCp7ImA9WhdbFk4.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4597327486105814383</id><published>2011-10-14T15:32:00.000-07:00</published><updated>2011-10-14T15:32:59.194-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-14T15:32:59.194-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Database Design" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS Summit" /><category scheme="http://www.blogger.com/atom/ns#" term="Data Warehousing" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>PASS Community Summit 2011 Day 3 Keynote</title><content type="html">&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;Dr. DeWitt has spoken
to the PASS Summit for the past two years – turning what was otherwise a very
forgettable “day 3” keynote slot into a must-see event for anyone going to the
Summit.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The past two years Dr. DeWitt
took us through the internals of columnstore databases and query
optimization.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;They were fantastically
content-rich and dug right to the bottom of the technology.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;On top of explaining the mechanics of the
query optimizer and theory of column-based storage, Dr. DeWitt demonstrated
understandable applications of the change in technology to common queries and
functions we all enjoy today in SQL Server.&amp;nbsp; He's also a pretty funny presenter.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;


&lt;a href="https://public.sn2.livefilestore.com/y1p6uFFt0aIqoAwyyaWHdwjAmTAvPnH93Yr5HIxGsBGl0NPN3XGYtyug0Thmgo3YRWPwvosN_rdgROH8JB9QcU06A/I%20Got%20Larry%20Ellison%20Mad.gif?download&amp;amp;psid=1" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1p6uFFt0aIqoAwyyaWHdwjAmTAvPnH93Yr5HIxGsBGl0NPN3XGYtyug0Thmgo3YRWPwvosN_rdgROH8JB9QcU06A/I%20Got%20Larry%20Ellison%20Mad.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;That brings us to
today and the changing world of data.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;
&lt;/span&gt;We’re going to get the concept of “big data” funneled into our brains
faster than we can process it – but that’s part of why I’m here.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;I hope to capture some of the content that
comes flying at us this morning about Hadoop and distributed data processing.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;But my other job is to comment on how this
movement will affect our industry going forward, changing your data, your job,
your server architecture, and even SQL Server internals.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;I have no doubt that I’ll only scratch the
surface of what Dr. DeWitt conveys this morning – and for that reason alone, I
recommend you don’t miss his keynote (if they can get him) next year at the
PASS Community Summit.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;According to Dr.
DeWitt, big data is a large collection of data – petabytes – on a large
collection of machines.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;To others, “big
data” means NoSQL, but that's not a requirement to Dr. DeWitt.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;
&lt;/span&gt;For some sophisticated commentary on Dr. DeWitt’s presentation (and some inspired discussion), I expect
to see something on &lt;a href="http://facility9.com/"&gt;Jeremiah Peschka’s blog&lt;/a&gt; – I’d encourage you to go read it
if you end up interested in this type of technology.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;


&lt;a href="https://public.sn2.livefilestore.com/y1p5RtXqOemG0ZKUQBSdmSrP9dIgg9-9OS4xBefNVQjrSkGQfc4Ahn8WGYZjFlQYFPVclJNhmte7AXY3rOsUBgIGA/The%20Guys%20Making%20Disk%20Drives.gif?download&amp;amp;psid=1" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1p5RtXqOemG0ZKUQBSdmSrP9dIgg9-9OS4xBefNVQjrSkGQfc4Ahn8WGYZjFlQYFPVclJNhmte7AXY3rOsUBgIGA/The%20Guys%20Making%20Disk%20Drives.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The data explosion is
largely due to automation, a sea change in collecting data.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;In the past, it was all manually entered, but
now cell phones collect location data automatically, clickstreams rule
advertising, and on and on.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The “old
guard” (and Dr. DeWitt freely considers himself part of that) would handle
these petabyte data warehouses on a parallel database system.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The new guard wants to use NoSQL.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;In his observations, current implementations
of NoSQL take about 5 times the server hardware as parallel technologies.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;For example, EBay stores 10PB on 256 nodes vs.
Facebook’s 20PB on 2700 nodes, and Bing’s 150PB on 27,000 nodes!&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Of course, parallel DB technologies are
typically (for good reason) delivered as appliances of high-quality hardware
compared to NoSQL usage of commodity type (possibly-heterogeneous) servers.&amp;nbsp; As with anything to do with databases - "it depends."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Calibri;"&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;N&lt;/span&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;oSQL isn’t all the
same – it’s a big tent of technology – but there are a couple major types: Key/value stores (CouchBase, MongoDB, …) and
Hadoop.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The former are intended
primarily for single-record updates/retrievals – you can think of them as the
“OLTP NoSQL” technology.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Hadoop is
designed for processing massive data sets, and is roughly expressible as “data
warehouse NoSQL.”&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pp9IiUH8Yt4P9JjRq04v9bz7OtD1RV408CrKkLKMmLpi2nRj5RA5dIwBIvkqi4-eQt_G5wk2A6m7UU-_ZZw-U5Q/Two%20Universes.gif?download&amp;amp;psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1pp9IiUH8Yt4P9JjRq04v9bz7OtD1RV408CrKkLKMmLpi2nRj5RA5dIwBIvkqi4-eQt_G5wk2A6m7UU-_ZZw-U5Q/Two%20Universes.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The claim that NoSQL
works on unstructured data, and RDBMSs are for structured data is a
misconception.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;NoSQL databases do have
structure – it’s just that the structure is applied to the data later in the
process than for your traditional RDBMS.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;
&lt;/span&gt;Instead of the metadata being stored with the data – in fact being a
requirement to actually store the data – NoSQL metadata is “applied” when the
analysis function processes the data.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;
I th&lt;/span&gt;ink of it as “compiled” vs. “interpreted” code.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;Only eight years ago, Google started in on the
big data problem in order to analyze clickstream data.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Hadoop is an open-source interpretation of
Google’s Map/Reduce+GFS system.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The
general structure has two parts – a fault-tolerant data storage layer (HDFS)
and a fault tolerant processing layer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The data storage layer
provides fault tolerant storage using file redundancy across different nodes in
the cluster of servers, protecting against individual server failure as well as
entire racks failing.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;You can think of
this like RAID – data is smartly distributed over the cluster.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;If one node fails, the data exists on other
nodes, so it isn’t lost.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The main
difference here is that RAID only addresses single disk failures, whereas the
HDFS protects against query, disk, server, switch, rack, and datacenter
failures without necessarily having to restart or recover… using only one “redundancy”
algorithm.&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pF_gTJR-TCf4ySDM8oMJOMIPylB1H4ZKksI3tbX0dd772X2-gGo1st5EFOMomDCpKhjt8hyMpIg4TRVr2DQLtkQ/Hive,%20Pig.gif?download&amp;amp;psid=1" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1pF_gTJR-TCf4ySDM8oMJOMIPylB1H4ZKksI3tbX0dd772X2-gGo1st5EFOMomDCpKhjt8hyMpIg4TRVr2DQLtkQ/Hive,%20Pig.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The layer that sits on
top of the storage is the processing engine – Map/Reduce.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Map/Reduce is best at performing
aggregations, but it isn’t designed to do joins.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Joins take a ton of code to achieve – four full
screens of multiple “programs” compared to a quarter-screen of SQL (HiveQL).&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Dr. DeWitt compared performance
of a few TPC-H “structured” queries between Hive and PDW – all showing
significant wins by parallel database “old guard” technology.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The reason is primarily due to “old
technology” being intentionally designed to handle these specific type of
queries – even though they’re aggregations that he’d just said perform
typically better in NoSQL scenarios.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;
&lt;/span&gt;Why?&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Because of the inherent
optimizations possible when the data used is a TPC-H workload, which is already
schema’d and loaded.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;If the data
structure wasn’t known ahead of time, a parallel database would not be capable
of servicing the query at all – until metadata was “applied” by performing ETL.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;There still is a
strong use case for NoSQL – and his reasoning follows how I think about the
relationship between SSAS (cubes) and PowerPivot (tabular) analysis
technologies.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;In Map/Reduce, the schema
is stored in the application that’s doing the analysis itself – not within the
data like in SQL.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;So it’s a lot “easier”
and better to use when you’re doing exploratory analysis of data.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Much like PowerPivot, you only need to define
enough schema to get your particular job done – not enough schema to get any
type of query done, or “explain” each piece of data in the set.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;But at some point, if your exploratory
analysis finds value in the data, you’re going to want to move it into an RDBMS
to get the query performance out of it, and have a consistent schema applied to
avoid two different analysis applications interpreting the data
in inconsistent ways.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Currently, there are
techniques and technologies for moving data between these platforms, but they can
be pretty difficult and involved.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;One of
those is called Sqoop.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1p6uFFt0aIqoCrddNs9Ynqz05rnSCdiXRihb96MCnOKSuP4PNRT2ynrxq58tFiIpjQrhgAK1xV2Do1jXiUDYphCA/No%20Product%20Announcements.gif?download&amp;amp;psid=1" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1p6uFFt0aIqoCrddNs9Ynqz05rnSCdiXRihb96MCnOKSuP4PNRT2ynrxq58tFiIpjQrhgAK1xV2Do1jXiUDYphCA/No%20Product%20Announcements.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;Dr.DeWitt envisions a
better way to share data between SQL and NoSQL worlds than Sqoop.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;He’s investigating the concept of an
“Enterprise Data Manager” that can relate and use unstructured and structured
data so that the appropriate engine can traverse and analyze whichever type of
data it’s presented with.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;A few ideas Dr. DeWitt
had for this year that “didn’t make the cut”, but could be a topic for next
year’s Summit:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;

&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;What the “Cloud” means
for databases&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;

&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;The impact of Solid State
Drives and Phase Change Memory&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;

&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt; ... whatever you might
want to see – send your ideas to PASS!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pp9IiUH8Yt4OivXMIc2BKDjBimqb2u93EmWDmWjQM_w0jgZcv5NP13EXvTJPe_YGslVOGgYpZ_zSENiGRNzemaA/Applause.gif?download&amp;amp;psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1pp9IiUH8Yt4OivXMIc2BKDjBimqb2u93EmWDmWjQM_w0jgZcv5NP13EXvTJPe_YGslVOGgYpZ_zSENiGRNzemaA/Applause.gif?download&amp;amp;psid=1" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="mso-ansi-language: EN-US;"&gt;&lt;span style="font-family: Calibri;"&gt;If you want more, visit &lt;a href="http://pages.cs.wisc.edu/~dewitt/"&gt;David DeWitt and his team on the web&lt;/a&gt;, there are links to the PASS talks on the left side.&amp;nbsp; My thanks go to Dr. DeWitt and the team that got him up on stage - I really hope they can do so again next year.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4597327486105814383?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ccYLMomdcD0:wt1q4sRsWFY:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=ccYLMomdcD0:wt1q4sRsWFY:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ccYLMomdcD0:wt1q4sRsWFY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ccYLMomdcD0:wt1q4sRsWFY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ccYLMomdcD0:wt1q4sRsWFY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=ccYLMomdcD0:wt1q4sRsWFY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/ccYLMomdcD0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4597327486105814383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4597327486105814383" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4597327486105814383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4597327486105814383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/ccYLMomdcD0/pass-community-summit-2011-day-3.html" title="PASS Community Summit 2011 Day 3 Keynote" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/10/pass-community-summit-2011-day-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQn44fSp7ImA9WhdUGUQ.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-2332509505818580791</id><published>2011-10-07T06:00:00.000-07:00</published><updated>2011-10-07T06:00:03.035-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-07T06:00:03.035-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Business Value" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS Summit" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>What I Learned at #SPC11</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1px-wSF9l0qIKG9Yeoll1o8mp2-jBdl8RcYJjguZ2WCj1VR_oipWZjMpS6eySRgJmVKIoFolYPjxYdJ8ZpexR5ZA/SPC11%20Logo.jpg?download&amp;amp;psid=1" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1px-wSF9l0qIKG9Yeoll1o8mp2-jBdl8RcYJjguZ2WCj1VR_oipWZjMpS6eySRgJmVKIoFolYPjxYdJ8ZpexR5ZA/SPC11%20Logo.jpg?download&amp;amp;psid=1" /&gt;&lt;/a&gt;This week, I attended the Microsoft SharePoint Conference 2011 (#SPC11) in Anaheim.&amp;nbsp; Not my usual beat, to be sure, but our company is starting to use SharePoint more, and we have no internal resources trained on it.&amp;nbsp; We have a "wild west" set of sites already, plan to add more for cross-functional project team sites, want to host BI solutions delivery, and we've got a project on the books to migrate an existing old-tech Intranet to SharePoint.&amp;nbsp; Better late than never, we're taking this opportunity to learn a little more.&lt;/div&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;I'm A Newb Here&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Overall, the conference was pretty good - I learned things I needed to know and got more comfortable with the usage, architecture, and management of SharePoint.&amp;nbsp; Of course, having not known these things prior to our "wild west" deployment, I now know we did it all wrong.&amp;nbsp; Some good news is that even though I may not yet know the "perfect" way to deploy SharePoint for our needs, I know what questions to ask, and generally how to "fix" our current deployment.&lt;/div&gt;
&lt;div&gt;
There was one more good opportunity I took advantage of at the conference.&amp;nbsp; I found myself in a fairly typical position for other people: I'm an almost complete newbie at the technology, and I didn't know anyone in the community.&amp;nbsp; That sounds eerily familiar to the situation that first-timers have at the SQL PASS Community Summit.&amp;nbsp; I was in the same position with SharePoint that they'll be in with SQL Server.&amp;nbsp; The difference is that I now know what I didn't when I was a first-timer at Summit.&amp;nbsp; I now know a great deal about the technology, the community, and the conference itself.&amp;nbsp; I'm participating as a "big brother" or "guide" for a gaggle of first-timers... Could I put my own "first-timer" experience at the SharePoint conference, contrast it with my "veteran" status at Summit, and help my first-timers get great value out of the Summit?&amp;nbsp; You bet.&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;And It Wasn't A Great Experience&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
To start off, I'll describe my experience at SPC11&amp;nbsp;for you - the discomfort, unfamiliarity, and frustration of it all.&amp;nbsp; Yes, I wasn't terribly comfortable at the conference.&amp;nbsp;&amp;nbsp;Despite what you may assume from reading here or meeting me in person, I'm an introvert.&amp;nbsp; I only exhibit this extrovert type of behaviour when I'm around friends, or in an environment where I'm comfortable with my perceived "expertise."&amp;nbsp; I didn't really want to start conversations with people I ate breakfast and lunch with in the convention dining hall.&amp;nbsp; Saying more than hi - even to the bare extent of offering my name as an introduction was difficult.&amp;nbsp; I forced myself to, but my reluctance was reinforced by the lack of responses I usually got.&amp;nbsp; I hardly acknowledged people sitting next to me in sessions - I often&amp;nbsp;sat two or three seats away from anyone else.&amp;nbsp; Sound like your typical convention-goer?&amp;nbsp; It does to me.&lt;/div&gt;
&lt;div&gt;
Add to that that I'm completely unfamiliar with the technology.&amp;nbsp; How do I know what sessions to go to, or what vendors to talk to?&amp;nbsp; I know that my organization has issues with SharePoint - not knowing how to use it, manage it, or architect it well.&amp;nbsp; But is there a session that covers that?&amp;nbsp; Not that I could find.&amp;nbsp; One may argue that a convention isn't the place I should be going to find this stuff out... but here I am at&amp;nbsp;SPC11 in exactly this boat, and I'm positive there are other wallflowers bailing water with me.&amp;nbsp; I don't even know the terminology well enough to know where to start!&amp;nbsp; From what I now know about&amp;nbsp;SharePoint and language used to describe it, I missed some helpful sessions.&amp;nbsp; Luckily they'll be online for me to review later.&amp;nbsp; But I won't get the opportunity to talk to the speaker after the session, or meet others who were also up at the podium asking similar questions (making me feel better about being a dummy) or talk to other experts that were trolling the area, offering assistance.&amp;nbsp; Opportunity definitely lost...&lt;/div&gt;
&lt;div&gt;
Being uncomfortable with the setting and unfamiliar with the technology made me frustrated.&amp;nbsp; I'm not used to being in that position, and the frustration drove me to learn more so I didn't stay in that situation.&amp;nbsp; Unfortunately, there's not much in the way of hand- or foot-holds to help me climb out of that pit... so I got more frustrated!&lt;/div&gt;
&lt;div&gt;
It wasn't a complete disaster, I did get a lot of useful information out of the conference.&amp;nbsp; Thanks in no small part to Mahmood Jaffer - he helped fill in that basic knowledge I was missing.&amp;nbsp; Yes - it only took one contact to "make things better."&amp;nbsp; But the experience itself was illuminating to me as to what little things could have helped me get so much more out of it.&amp;nbsp; I'm glad to say that PASS' programs - of which the first-timer program is an example - do help.&amp;nbsp; But even though PASS is doing many things "right", I think they could do more, and relatively easily.&amp;nbsp; &lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Necessity Is The Mother...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Here were my issues on being a first-time conference attendee at the SharePoint Conference:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;I couldn't identify "experts".&amp;nbsp; (Perhaps I should clarify that I'm equating "experts" with "people that will help me".)&amp;nbsp; I think speakers had a different badge accent colour - but I'm not sure.&amp;nbsp; Vendors definitely did.&amp;nbsp; MVPs did not.&amp;nbsp; No ribbons either.&amp;nbsp; I spent the entire welcome reception in vain trying to find one - not even vendors knew who or where they were.&lt;/li&gt;
&lt;li&gt;I didn't know my (independently reserved) hotel had a shuttle to the conference until I registered.&lt;/li&gt;
&lt;li&gt;I didn't know my (independently reserved) hotel internet access was covered until I checked out.&amp;nbsp; (I bought it anyway - had to in order to do office work, and was prepared to expense it.)&lt;/li&gt;
&lt;li&gt;Apparently, there was a "birds of a feather" area.&amp;nbsp; The only information I saw on it was on a room directory, but I didn't investigate further.&amp;nbsp; I don't know what kind of "feathers" they were - industry or feature - and I didn't know when it was either.&lt;/li&gt;
&lt;li&gt;Apparently, there were Hands-On labs available.&amp;nbsp; Again, I only saw passing reference to rooms on signage, without any description of lab content in the conference registration package or emails.&amp;nbsp; (They did promote certification exams though.)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
I think it's also important to note I had the double-whammy of being a product newbie as well as a conference newbie.&amp;nbsp; Here were my issues on being completely unfamiliar to the technology of SharePoint:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;I didn't know the product features or purpose - not even enough to know what I didn't know.&lt;/li&gt;
&lt;li&gt;I didn't know how important knowing certain things was.  Was understanding claims-based security more important than knowing how to&amp;nbsp;leverage content types?&lt;/li&gt;
&lt;li&gt;I still don't even know what I don't know...&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Even though I'm sure some of the above two lists&amp;nbsp;was in the documentation or registration package, I was more interested in addressing other issues than in reading all that to pull out a nugget or two.&amp;nbsp; &lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;...Of Invention&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
I think the conference organizers could have helped me out with those&amp;nbsp;problems by:&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Delivering better preparatory email to new/all attendees.&amp;nbsp; I was actually shocked by the grand total of two - yes TWO - emails from the conference organizers that only served to help me prepare logistically... minus key shuttle and hotel internet information.&lt;/li&gt;
&lt;li&gt;Targeting emails by attendee "type".&amp;nbsp; I don't want a ton of spam either.&amp;nbsp; Separating communications for "newbs" versus "returnees" would help keep content from being inadvertently categorized as spam or irrelevant by the receiver.&lt;/li&gt;
&lt;li&gt;Identifying experts.&amp;nbsp; SPC11 didn't have the ribbons all us PASS vets know (and I hope you love as much as I now do).&amp;nbsp; Yes, they had a "badge customization" booth you could go to after registration to "add bling" to&amp;nbsp;your badge (their words, not mine) with fairly unhelpful ribbons like "Internet Sensation" and "Hire Me".&amp;nbsp; (Really?)&amp;nbsp; Summit's ribbons are better, but perhaps they aren't as helpful as they could be.&amp;nbsp; Instead of a ribbon for "MVP" or "Speaker" (can't remember all the ones I've had), they should have one of the colours (say red) with technology words.&amp;nbsp; Pasting a red "Clustering" ribbon on your badge would mean "I know clustering, and I can (and want to) answer your questions about it."&amp;nbsp; SPC11 didn't put those "bling" ribbons in everyone's packet (nor would I want PASS to), they had a free-for-all booth to pick and apply your own.&amp;nbsp; That would work for a set of "I'm here to help with" ribbons (borrowing Andy Leonard's trademark).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
SPC11&amp;nbsp;could have helped a product ignoramus like me more easily by:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Having an experts area manned at all hours of the conference.&amp;nbsp; Heck, "experts" is asking too much.&amp;nbsp; "People with a passing familiarity" would do!&amp;nbsp; I would have LOVED to have sat down with someone at the Welcome Reception who could have:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Found out what I knew about SharePoint and what I didn't&lt;/li&gt;
&lt;li&gt;Found out what my learning goals were for the conference&lt;/li&gt;
&lt;li&gt;Given those, helped me to identify appropriate sessions/events to attend&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Having an "I'm new to SharePoint" track.&amp;nbsp; I know that program selection is a hard job - one of the problems is having appropriately leveled content.&amp;nbsp; If there was a dedicated "I'm new to &amp;lt;product&amp;gt;" track with ONLY 100-level sessions in it, I think a newbie would do quite well, thank you.&amp;nbsp; Yes, as a SQL newb, I might only care about DBA type content, not BI, cloud, and/or modeling&amp;nbsp;content that would (should) be delivered in such a track.&amp;nbsp; But if the first session(s) in that track explained the big picture - the stack, the different tech, AND the typical job descriptions associated with SQL Server, I think that would help newbs a LOT.&amp;nbsp; Follow that up with intro sessions to the sub-products and features.&amp;nbsp; With that taken care of, the program committee could feel more freedom in&amp;nbsp;loading up on 300/400 level sessions.&lt;/li&gt;
&lt;li&gt;Alternatively, have an "I'm new to &amp;lt;product&amp;gt;" pre-con to cover that...&lt;/li&gt;
&lt;li&gt;Pass out/win "I know &amp;lt;product&amp;gt; &amp;lt;feature&amp;gt;, thanks to &amp;lt;conference&amp;gt;" shirts with "Ask me about &amp;lt;feature&amp;gt;" on the back.&amp;nbsp; Have them at the ATE booths for "experts" to give to attendees they think learned something about the subject... with a soft commitment from attendees to WEAR THE SHIRT during the conference and bring it next year.&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Make Conferences Better!&lt;/span&gt;&lt;br /&gt;
The above lists are directed at the SharePoint Conference - but I hope PASS can take away some nuggets as well.&amp;nbsp; I think most of those points could help make the first-timer and/or newbie experience so much better, and draw attendees into the awesome community that we have already.&amp;nbsp; Since this has turned into an "open letter" to PASS (I'll be drawing their attention to it), I would also encourage members of the PASS board to attend a conference every year that they've never attended before - big, small, on a technology which they're completely new to, doesn't matter - for the express purpose of putting themselves in the shoes of those they want to serve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-2332509505818580791?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y79x2cDgEgc:JGbrBfT8A40:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=y79x2cDgEgc:JGbrBfT8A40:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y79x2cDgEgc:JGbrBfT8A40:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y79x2cDgEgc:JGbrBfT8A40:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y79x2cDgEgc:JGbrBfT8A40:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=y79x2cDgEgc:JGbrBfT8A40:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/y79x2cDgEgc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/2332509505818580791/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=2332509505818580791" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2332509505818580791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2332509505818580791?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/y79x2cDgEgc/what-i-learned-at-spc11.html" title="What I Learned at #SPC11" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/10/what-i-learned-at-spc11.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEHRXs9eyp7ImA9WhdUFks.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8343519354712471970</id><published>2011-10-03T10:57:00.000-07:00</published><updated>2011-10-03T10:57:14.563-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T10:57:14.563-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Business Value" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Administrivia" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><title>A "New Guy" Joins Our Team</title><content type="html">It's a great day for me and &lt;a href="http://www.mouldingandmillwork.com/"&gt;Moulding and Millwork&lt;/a&gt; (the company I work for).&amp;nbsp; A few weeks back, I let you all know that I'd been given the green light on finding someone to help me out with Data Warehousing.&amp;nbsp; One of the first people I turned to for suggestions on finding someone was Scott Stauffer, the chapter leader of the &lt;a href="http://vancouverbi.sqlpass.org/"&gt;Vancouver BI PASS&lt;/a&gt; chapter, PASS regional mentor, and SQLSaturday organizer.&amp;nbsp; I was hoping Scott could help me find the right person out there to help grow and support the fact-based decision making engine I envisioned working at M&amp;amp;M.&amp;nbsp; Scott has a ton of contacts from being a leader in the community, and having a busy consulting practice in the area for years and years.&lt;br /&gt;
Scott thought my news was great - he was really excited for me that what I've been working towards was looking like it was gaining a lot of traction.&amp;nbsp; But then he surprised me.&amp;nbsp; He didn't start by giving me a list of people he knew that would fit the position.&amp;nbsp; Nor did he point me towards recruiters or job boards.&amp;nbsp; The first thing Scott asked was if I thought he would fit the position.&amp;nbsp; That totally threw me for a loop.&amp;nbsp; I was expecting to have either a naive kid to train up completely, or a SSAS geek to learn from.&amp;nbsp; It won't surprise you to find out that I was (after the shock) VERY interested in working out arrangements with Scott.&amp;nbsp; (If you get an MVP interested in working with you... you find out a way to say yes.)&amp;nbsp; On top of being a great community supporter and organizer - which only touches the tip of his interpersonal capabilities and vision for the big picture - Scott is an exceptional technical talent at the whole Microsoft BI stack.&amp;nbsp; Yes, he'll claim that I've got him beat in Integration Services, but I actually don't think so.&amp;nbsp; I'm a hacker (in the classical sense) in SSIS, and only have one "project" to claim on my resume.&amp;nbsp; I've managed to milk that into an MVP award for the third year in a row now (yay!) which I just found out about this past weekend.&amp;nbsp; But Scott has a list longer than my arm of successes in this space that I now get to draw on and use to help our IT department support our business with insightful data to help them make visionary decisions quickly and more confidently than ever before.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://a1.twimg.com/profile_images/1568571207/198b0edc-af6d-420e-84bd-94baa070b2a7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://a1.twimg.com/profile_images/1568571207/198b0edc-af6d-420e-84bd-94baa070b2a7.png" /&gt;&lt;/a&gt;&lt;/div&gt;
With that, I'll be accepting your congratulations to me for landing Scott as a partner in crime here at Moulding and Millwork.&amp;nbsp; It's a real coup for me, and I'm pretty happy with myself at the moment. ;) I'll make sure his badge at &lt;a href="http://www.sqlpass.org/summit/2011/"&gt;PASS Summit&lt;/a&gt; is appropriately labeled with his new allegiance.&amp;nbsp; Oh... and I guess you can send your congratulations to him &lt;a href="http://twitter.com/#!/sqlsocialite"&gt;on twitter&lt;/a&gt; or in person at the Summit.&amp;nbsp; He'll have to get used to the good-natured ribbing I dole out - welcome to M&amp;amp;M Scott!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-8343519354712471970?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=XlApMK0Wv7I:PhOzb_sLhsE:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=XlApMK0Wv7I:PhOzb_sLhsE:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=XlApMK0Wv7I:PhOzb_sLhsE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=XlApMK0Wv7I:PhOzb_sLhsE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=XlApMK0Wv7I:PhOzb_sLhsE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=XlApMK0Wv7I:PhOzb_sLhsE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/XlApMK0Wv7I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8343519354712471970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=8343519354712471970" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8343519354712471970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8343519354712471970?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/XlApMK0Wv7I/new-guy-joins-our-team.html" title="A &quot;New Guy&quot; Joins Our Team" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/10/new-guy-joins-our-team.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04EQXw6fyp7ImA9WhdWE0w.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8463413533947558009</id><published>2011-09-06T05:25:00.000-07:00</published><updated>2011-09-06T05:25:00.217-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T05:25:00.217-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Parallelism" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Parallelizing Slow Parts of the Data Flow - Part 1 - Preparation</title><content type="html">It's quite common to have parts of your Data Flow that are slow, and there are some techniques you can use to improve performance of those parts.&amp;nbsp; One of them is to try to parallelize the slow operation - but that only works for operations that are parallelizable.&amp;nbsp; Sort isn't one of them - sorry to say.&amp;nbsp; And you really have to know how the data flow works to make sure you don't try fixing &lt;a href="http://toddmcdermid.blogspot.com/2010/09/parallelism-in-ssis-multiple-lookups.html"&gt;a problem that looks "serial" but is, in fact parallel&lt;/a&gt;&amp;nbsp;- you'll only make things worse.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Identifying Parallelization Opportunities&lt;/span&gt;&lt;br /&gt;
So what scenarios does parallelization work for?&amp;nbsp; &lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Positive Signs&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Here are some characteristics that should identify a good candidate for parallelizing a portion of your data flow.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The operation applies independently to single rows, or to an easily identifiable&amp;nbsp;subset of rows.&lt;/li&gt;
&lt;li&gt;There's a known-slow resource in use that allows&amp;nbsp;concurrent use (SQL Server, disk, web, ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Counter Indications&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
If your data flow has any of the following characteristics, it's not likely that parallelizing (alone) will help speed anything up.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The server's CPU is at or near capacity during the slow section of the data flow.&lt;/li&gt;
&lt;li&gt;Any external resources (SQL Server, file system, network) the slow section of the data flow uses are already at or near capacity.&lt;/li&gt;
&lt;li&gt;Some part of the slow section requires all rows at once - an aggregate or sort, for example.&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Test, Backup, Change, Test, Backup, Change, ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;After applying a parallelization technique, you'll need to figure out if it's better, right?&amp;nbsp; Then the first thing you have to do is measure the performance of your current design&amp;nbsp;(obviously!).&amp;nbsp; Make sure you measure a few things - time to completion, CPU, RAM, network, and disk utilizations.&amp;nbsp; Run the test at least three times in a row to eliminate caching effects and get a good average.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;We measure all those attributes so that we can see what we're trading speed for.&amp;nbsp; The idea is to trade CPU utilization for speed - but we could have to pay RAM and I/O as well - to a degree you might not be comfortable with.&amp;nbsp; That's why we keep an eye on those metrics.&lt;/span&gt;&lt;br /&gt;
Before you make any changes... make sure you back up your original!&amp;nbsp; Your quest to improve performance using one technique might work somewhat, and you may want to try another technique.&amp;nbsp; If you have a backup of your original package, it'll (probably) be easier to implement the second technique from there, while ensuring your actual logic remains consistent.&amp;nbsp; Do also back up your attempts - you might try a few techniques&amp;nbsp;but decide the first one worked "best".&lt;br /&gt;
Make your change to parallelize the package, then double-check the result is the same as your original.&amp;nbsp; It doesn't do any good to make your data go faster if you ruin it in the process.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Be Prepared For Disappointment&lt;/span&gt;&lt;br /&gt;
Even if your slow section seems to fit the profile I outlined, there's no guarantee applying a parallelization technique will help.&amp;nbsp; You may not be able to squeeze any more time out of the process due to some limiting factor you weren't aware of when you started.&amp;nbsp; Or the trade of speed for some other resource just isn't something you're ready to make.&lt;br /&gt;
What follows will be posts on using the Balanced Data Distributor, then a "poor man's" BDD using existing components for those of you that can't install additional software (even when published by Microsoft).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-8463413533947558009?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=TgHmh1B2QwE:82nxJhVZpg0:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=TgHmh1B2QwE:82nxJhVZpg0:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=TgHmh1B2QwE:82nxJhVZpg0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=TgHmh1B2QwE:82nxJhVZpg0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=TgHmh1B2QwE:82nxJhVZpg0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=TgHmh1B2QwE:82nxJhVZpg0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/TgHmh1B2QwE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8463413533947558009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=8463413533947558009" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8463413533947558009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8463413533947558009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/TgHmh1B2QwE/parallelizing-slow-parts-of-data-flow.html" title="Parallelizing Slow Parts of the Data Flow - Part 1 - Preparation" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/09/parallelizing-slow-parts-of-data-flow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAMQ3k6cSp7ImA9WhdWFU8.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4243008194572928148</id><published>2011-08-29T05:59:00.000-07:00</published><updated>2011-09-08T15:59:42.719-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-08T15:59:42.719-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Inserting Records AND Getting The Identity in SSIS - Part 2</title><content type="html">Since&amp;nbsp;I posted a ways back&amp;nbsp;on &lt;a href="http://toddmcdermid.blogspot.com/2009/08/inserting-records-and-getting-identity.html"&gt;retrieving the identity value for inserts in SQL Server Integration Services&lt;/a&gt;, I've learned many things - one of which is an inline solution for that problem I didn't know back then.&amp;nbsp; Check out that previous post for the business problem, then come back here for an "inline" solution using SSIS - without scripts - just regular SSIS tasks and components.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;It's a Love/Hate Relationship&lt;/span&gt;&lt;br /&gt;
The OLE DB Command component in SSIS is a near-universally hated object due to it's inherent performance problems.&amp;nbsp; But it's so hard to hate when it can actually get the job done when nobody else can.&lt;br /&gt;
Yes, our old nemesis is back to solve a problem for us... at the same price it's always asked.&amp;nbsp; Do you want your packages to run fast, but be complicated?&amp;nbsp; Or do you want them to run slow, but be easy to understand?&amp;nbsp; Sadly, there is not&amp;nbsp;much&amp;nbsp;middle ground.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Keys&lt;/span&gt;&lt;br /&gt;
It turns out to be pretty easy, and I should have got it into my thick skull before, from all the hints I'd read.&amp;nbsp; A stored procedure with an OUTPUT parameter, and the OLE DB Command are the keys.&amp;nbsp; For this example, assume we're using a table that has only two columns: ID and TEXTVALUE, with ID being the automatically generated identity column.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Stored Procedure&lt;/span&gt;&lt;br /&gt;
Unfortunately, this doesn't use much of the GUI power of SSIS, it's old hand-coding.&amp;nbsp; For our simple table, this would be the stored procedure definition:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;CREATE PROCEDURE &lt;/span&gt;&lt;span style="color: black;"&gt;InsertData&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343;"&gt;@textvalue &lt;/span&gt;&lt;span style="color: blue;"&gt;AS CHAR&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;10&lt;/span&gt;&lt;span style="color: grey;"&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343;"&gt;@id &lt;/span&gt;&lt;span style="color: blue;"&gt;AS INT &lt;/span&gt;&lt;span style="color: black;"&gt;OUTPUT&lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;INSERT INTO &lt;/span&gt;&lt;span style="color: black;"&gt;IdentityTable &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;textvalue&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;VALUES &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: #434343;"&gt;@textvalue&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;SET &lt;/span&gt;&lt;span style="color: #434343;"&gt;@id &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: magenta;"&gt;SCOPE_IDENTITY&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The SSIS Data Flow&lt;/span&gt;&lt;br /&gt;
Use a Derived Column to generate the ID column with a NULL(DT_I4) value in it.&amp;nbsp; (We need somewhere to place our identity value in.)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pGPiNOPJQ997tEG1HVF-cUeHLsox-7aJIbW7mG8ZhPVKKI3T5QWzweWvoqpOLSfU9MSuscJQMVG0uvgY_Iouzzg/Derived%20Column%20for%20generating%20ID.jpg?download&amp;amp;psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="28" src="https://public.sn2.livefilestore.com/y1pGPiNOPJQ997tEG1HVF-cUeHLsox-7aJIbW7mG8ZhPVKKI3T5QWzweWvoqpOLSfU9MSuscJQMVG0uvgY_Iouzzg/Derived%20Column%20for%20generating%20ID.jpg?download&amp;amp;psid=1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Following that, we can work on the OLE DB Command component, using a statement like this:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;EXEC &lt;/span&gt;&lt;span style="color: black;"&gt;InsertData ?, ? OUTPUT&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Map the columns as you'd expect to map them.&lt;br /&gt;
If you'd like I've got an &lt;a href="https://ftjcdg.sn2.livefilestore.com/y1phlHlev87_WinfrmOC0ZPbtlPVWbCLLYoJHAKHX8CgGavFNHa_WavmiE5hsxnflFWRH5T9drdX6r2a-MvL7qBFA/Reading%20Identity.zip?download&amp;amp;psid=1"&gt;SSIS 2008 package showing this&lt;/a&gt;&amp;nbsp;technique.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Big Picture&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pCLoe8Kv1ZeDJvvEDmogDuIi0emCBYr8DVPpjYje6GjNbdQGht5vIDvCXAthqd9jUpymXDHsL4O0BLGPqJ2G9GA/Identity%20Retrieval%20in%20Data%20Flow.jpg?download&amp;amp;psid=1" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://public.sn2.livefilestore.com/y1pCLoe8Kv1ZeDJvvEDmogDuIi0emCBYr8DVPpjYje6GjNbdQGht5vIDvCXAthqd9jUpymXDHsL4O0BLGPqJ2G9GA/Identity%20Retrieval%20in%20Data%20Flow.jpg?download&amp;amp;psid=1" /&gt;&lt;/a&gt;Sure, it works - but here are the drawbacks:&lt;/div&gt;
It's going to perform badly.&amp;nbsp;&lt;em&gt;Horribly&lt;/em&gt; if the package is run on a different server from the database the stored procedure is on.&amp;nbsp; I can't stress that enough.&amp;nbsp; The OLE DB Command component is making a round-trip call to the database for each row.&amp;nbsp; Even on the same machine, that's an expensive operation.&lt;br /&gt;
You're doing an RBAR (row by agonizing row) process which is much, much slower than a set-based process that SQL Server is more suited for.&amp;nbsp; (SSIS is fine with RBAR, it's designed that way.)&amp;nbsp; Neither SQL Server process nor the Integration Services runtime will be working very hard during this part of the data flow - I don't think even one core would get utilized fully due to the wait-states involved.&lt;br /&gt;
If you're interested, here's a sample package to show this process.&amp;nbsp; It creates a database on your local machine, creates the sample table, generates one row, performs the insert (and shows the result to you), then tears the database down.&lt;br /&gt;
Can we mitigate this RBAR flaw?&amp;nbsp; Stick around or&amp;nbsp;&lt;a href="http://toddmcdermid.blogspot.com/feeds/posts/default"&gt;subscribe your RSS reader&lt;/a&gt; to find out in an upcoming post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4243008194572928148?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ldtSS3m9vls:RksoqBRA7xQ:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=ldtSS3m9vls:RksoqBRA7xQ:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ldtSS3m9vls:RksoqBRA7xQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ldtSS3m9vls:RksoqBRA7xQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=ldtSS3m9vls:RksoqBRA7xQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=ldtSS3m9vls:RksoqBRA7xQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/ldtSS3m9vls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4243008194572928148/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4243008194572928148" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4243008194572928148?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4243008194572928148?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/ldtSS3m9vls/inserting-records-and-getting-identity.html" title="Inserting Records AND Getting The Identity in SSIS - Part 2" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/08/inserting-records-and-getting-identity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMCQXgzcCp7ImA9WhdXEEk.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4572377680370395573</id><published>2011-08-22T13:44:00.000-07:00</published><updated>2011-08-22T13:54:20.688-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-22T13:54:20.688-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Business Value" /><category scheme="http://www.blogger.com/atom/ns#" term="Administrivia" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>Anyone Want to Work With Me?</title><content type="html">Let's see... my last post was almost a month ago, and&amp;nbsp;it was a pretty small one.&amp;nbsp; I've been busy!&lt;br /&gt;
But it's good to be busy, especially when the housing market has looked so bad in the past few years, and you work for a company that directly serves that industry.&amp;nbsp; My &lt;a href="http://toddmcdermid.blogspot.com/2010/06/guerilla-bi-sanctioned-with-plausible.html"&gt;guerilla war about data&lt;/a&gt; as (apparently) been successful enough that I'm now looking for someone to help us out, full time.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What Do I Want?&lt;/span&gt;&lt;br /&gt;
I want your job.&amp;nbsp; Seriously.&amp;nbsp; I'm of two minds on getting another body in here.&amp;nbsp; On the one hand, it should make things happen faster - but on the other, that's work I &lt;em&gt;won't get to do&lt;/em&gt; and things I &lt;em&gt;won't get to learn&lt;/em&gt;.&amp;nbsp; If I could clone myself, or get by with only a few hours sleep a night like Buck Woody, I'd do it.&amp;nbsp; (If you know me personally, that last sentence is pretty funny.)&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's the Job?&lt;/span&gt;&lt;br /&gt;
I need some help working on our data warehouse.&amp;nbsp; I feel pretty comfortable with the "first half" of the technical aspects of it - sourcing the data and transforming it into an appropriate dimensional model inside a relational store.&amp;nbsp; What I don't know well is the "last half" - working Analysis Services, a reporting tool (RS, Crescent, Tableau, QlikView, ...), and SharePoint.&amp;nbsp; We have a small team of hardware/OS guys, but they don't know this stuff either, and don't have a massive budget to address our coding inefficiencies.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;This Isn't a Backroom Job&lt;/span&gt;&lt;br /&gt;
If you're not very comfortable talking to "suits," you won't enjoy this job.&amp;nbsp; Without a doubt, you'll be working with C-level executives and&amp;nbsp;VPs from time to time.&amp;nbsp; Even though you may feel most at home in a cave gently washed by LED backlighting, you'll need fantastic communication skills in email, phone, and face-to-face situations all over North America.&amp;nbsp; It won't be the majority of your work, but you'll have to be comfortable with teaching "end users," evangelizing our capabilities, and listening &lt;strong&gt;very hard&lt;/strong&gt; for opportunities and difficulties with data.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Self-Starters Only&lt;/span&gt;&lt;br /&gt;
Another reason I'm hesitant to move in this direction is that I loathe having to monitor other people... in part because I get distracted by work myself.&amp;nbsp; If you need constant feeding, at some point you'll starve to death because I've unintentionally ignored you.&amp;nbsp; You need to find your own work and check in with others from time to time to make sure we're all part of the same pack, pulling in the same direction.&lt;br /&gt;
I'm looking for a flexible mind, a problem solver, and a committed learner.&amp;nbsp; Someone who isn't a 9 to 5er, but understands that's when they'll get called for information.&amp;nbsp; You will also have to feed my desire to learn from you.&amp;nbsp; I want to understand the technology&amp;nbsp;so we can&amp;nbsp;offer the guys who do&amp;nbsp;real work at this company&amp;nbsp;the data and insights they need to keep us on top.&amp;nbsp; I'll reciprocate gladly - anything you want to know about anything you think I know.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Benefits Are Great&lt;/span&gt;&lt;br /&gt;
I'm not going to go into a lot of details here - because there's only one that should get me the applicants I want, the rest should take care of itself.&amp;nbsp; I like working here because I get to do what I love, and work with people that like what they do.&amp;nbsp; If you're passionate about fact-based decision making, and want to help provide it to a company that's waking up to how valuable that can be, contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4572377680370395573?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gHWfKNxpoH0:THN7ymM3b-0:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=gHWfKNxpoH0:THN7ymM3b-0:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gHWfKNxpoH0:THN7ymM3b-0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gHWfKNxpoH0:THN7ymM3b-0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gHWfKNxpoH0:THN7ymM3b-0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=gHWfKNxpoH0:THN7ymM3b-0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/gHWfKNxpoH0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4572377680370395573/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4572377680370395573" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4572377680370395573?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4572377680370395573?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/gHWfKNxpoH0/anyone-want-to-work-with-me.html" title="Anyone Want to Work With Me?" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/08/anyone-want-to-work-with-me.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEARHc6cSp7ImA9WhdVEkw.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4117214224225234608</id><published>2011-07-27T05:14:00.000-07:00</published><updated>2011-09-16T15:54:05.919-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-16T15:54:05.919-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quick Hit" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Office" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Quick Hit: Using XLSM Files With SSIS</title><content type="html">If you've tried to use an Excel 2010 XLSM file - a "macro-enabled" spreadsheet - with Integration Services, you'll have seen the incorrect (and badly worded) message that the "File path contains invalid Excel file.&amp;nbsp; Please provide file with .xls or .xlsx extension."&amp;nbsp; It looks like the SSIS team just didn't know that Excel makes other flavours of files.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How Do You Get Around This Limitation?&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Create an Excel Connection Manager to refer to ANY other spreadsheet with a "valid" XLS or XLSX extension.&amp;nbsp; (You don't have to save your XLSM file "as" an XLSX.)&lt;/li&gt;
&lt;li&gt;Select the Excel Connection Manager in your Connection Managers pane.&lt;/li&gt;
&lt;li&gt;Open the Properties Window (F4).&lt;/li&gt;
&lt;li&gt;Change the "Server Name" property to the full pathname of your XLSM file.&lt;/li&gt;
&lt;/ol&gt;
Done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4117214224225234608?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=I27Cdb8SFws:x3OvGHbFI1g:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=I27Cdb8SFws:x3OvGHbFI1g:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=I27Cdb8SFws:x3OvGHbFI1g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=I27Cdb8SFws:x3OvGHbFI1g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=I27Cdb8SFws:x3OvGHbFI1g:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=I27Cdb8SFws:x3OvGHbFI1g:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/I27Cdb8SFws" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4117214224225234608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4117214224225234608" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4117214224225234608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4117214224225234608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/I27Cdb8SFws/quick-hit-using-xlsm-files-with-ssis.html" title="Quick Hit: Using XLSM Files With SSIS" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/07/quick-hit-using-xlsm-files-with-ssis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EGQX87eCp7ImA9WhdSEEo.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-2707618408910565879</id><published>2011-07-19T05:47:00.000-07:00</published><updated>2011-07-19T05:47:00.100-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-19T05:47:00.100-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS Summit" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>PASS Summit 2011 Content - It's Your Choice</title><content type="html">If you're reading this post and attending the PASS Summit 2011 in Seattle, you absoutely should vote for two things with regards to the Summit: Dr. DeWitt's keynote subject, and the Community Sessions.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Dr. DeWitt's Keynote&lt;/span&gt;&lt;br /&gt;
I've been to the Summit for the past two years (I think... it's hazy) and one of the absolute highlights has been Dr. DeWitt's presentations.&amp;nbsp;&amp;nbsp;2009 was&amp;nbsp;on columnar database technology, 2010 was about query optimization.&amp;nbsp; Believe me - he does &lt;strong&gt;not&lt;/strong&gt; dumb things down, and he's &lt;strong&gt;not&lt;/strong&gt; from marketing.&amp;nbsp; There's a reason everyone raves about his presentations - he talks to geeks the way we want to be talked to.&lt;br /&gt;
Just like last year, PASS is asking you to &lt;a href="http://www.sqlpass.org/summit/2011/SummitContent/Voteforthe2011DavidDeWittKeynoteTopic.aspx"&gt;help select Dr. DeWitt's topic&lt;/a&gt;.&amp;nbsp; The theme&amp;nbsp;this year seems to be parallelism&amp;nbsp;technology - big data&amp;nbsp;or big iron.&amp;nbsp; Would you like the doctor to explain Hadoop and distributed data processing, or describe the coming impact of the increasing number of CPU cores and&amp;nbsp;I/O changes?&amp;nbsp; If you're a DBA, I can see you being interested in the Moore's Law presentation.&amp;nbsp; But since I'm closer to the DBD demographic, I've voted for the Hadoop talk.&lt;br /&gt;
Best quote from Dr. DeWitt last year (I'm paraphrasing): "Guys that drop out of query optimizing because it's too hard... go build rockets for NASA."&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Community Sessions&lt;/span&gt;&lt;br /&gt;
Apparently, the PASS Summit Program Committee is taking a day off, because PASS is asking for our help to round out the Summit schedule.&amp;nbsp; (I kid - the PC did a great job this year and deserve a day off... even though I know they're not taking one.)&amp;nbsp; From various sources, the Program Committee has selected &lt;a href="http://www.sqlpass.org/summit/2011/SummitContent/CommunityChoice.aspx"&gt;20 candidate sessions that are competing for five slots&lt;/a&gt;.&amp;nbsp; Here are my choices, based solely on what I need to learn and want to see:&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Robert Cain on Project Juneau&lt;/span&gt;&lt;/strong&gt; - The team I'm with needs to understand databases better.&amp;nbsp; It's really hard to help them get there when the code they write is so very disconnected from the database.&amp;nbsp; As I understand it, Juneau is a step towards integrating code and the database better - which would give me better tools to encourage using better code and a real database.&lt;br /&gt;
&lt;span style="color: #e69138;"&gt;&lt;strong&gt;Wendy Pastrick on Visualizing Indexes&lt;/strong&gt;&lt;/span&gt; - My understanding of index internals is woefully deficient.&amp;nbsp; I certainly think I know the basics, but I could really use more.&lt;br /&gt;
&lt;span style="color: #e69138;"&gt;&lt;strong&gt;Chris Webb on SSAS Security&lt;/strong&gt;&lt;/span&gt; - This one is probably over my head at the moment - but I know it's inevitable that I'll be called upon to deliver it.&amp;nbsp; My org is presently just too paranoid (IMO) about spilling too many secrets to parallel lines of business.&lt;br /&gt;
&lt;span style="color: #e69138;"&gt;&lt;strong&gt;John Welch on Advanced DW Scenarios&lt;/strong&gt;&lt;/span&gt; - Some of what I want to be able to deliver in my DW seems to require what John's talking about here... but I don't know enough to say for sure, that's why I have to go.&lt;br /&gt;
&lt;span style="color: #e69138;"&gt;&lt;strong&gt;Jen Stirrup on Data Visualizations&lt;/strong&gt;&lt;/span&gt; - This topic is both fascinating to me and severely frustrating.&amp;nbsp; I yearn for the ability to get rid of the complex reams of tabular reporting that require significant mental effort to decipher.&amp;nbsp; I've done my best with Excel 2007, but I need to expand my toolset to accomplish transforming my business' expectations.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Vote Now&lt;/span&gt;&lt;br /&gt;
If you're attending the Summit, please vote for the &lt;a href="http://www.sqlpass.org/summit/2011/SummitContent/Voteforthe2011DavidDeWittKeynoteTopic.aspx"&gt;keynote&lt;/a&gt; and &lt;a href="http://www.sqlpass.org/summit/2011/SummitContent/CommunityChoice.aspx"&gt;session schedule&lt;/a&gt; you'd like to see.&amp;nbsp; You've only got until the 20th of July.&amp;nbsp; Please don't make it a popularity contest about the speaker - because that means I'll lose :)&amp;nbsp; Yes, I happen to be listed twice!&amp;nbsp; I have a session&amp;nbsp;on complex SSIS executions and another on processing slowly changing dimensions&amp;nbsp;in the running.&amp;nbsp; If straightforward SQL Agent Jobs can't solve your SSIS execution scenario, I've got some techniques to help.&amp;nbsp; If John Welch's presentation on advanced DW scenarios is a little &lt;em&gt;too&lt;/em&gt; advanced, maybe mine fits in your ballpark a little better.&lt;br /&gt;
Whatever your interests, please do pick some.&amp;nbsp; It's a shame that so many great sessions are in competition with each other - but I'll be happy to be a loser if it means you get sessions that will do you some good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-2707618408910565879?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=WbrLXXWPU9A:xbI4y300lS8:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=WbrLXXWPU9A:xbI4y300lS8:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=WbrLXXWPU9A:xbI4y300lS8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=WbrLXXWPU9A:xbI4y300lS8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=WbrLXXWPU9A:xbI4y300lS8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=WbrLXXWPU9A:xbI4y300lS8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/WbrLXXWPU9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/2707618408910565879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=2707618408910565879" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2707618408910565879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2707618408910565879?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/WbrLXXWPU9A/pass-summit-2011-content-its-your.html" title="PASS Summit 2011 Content - It's Your Choice" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/07/pass-summit-2011-content-its-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGQXo6fyp7ImA9WhdTGUQ.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-3774846829210905264</id><published>2011-07-18T05:52:00.000-07:00</published><updated>2011-07-18T05:52:00.417-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T05:52:00.417-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Presenting Upserts to PASS AppDev VC</title><content type="html">Hopefully this crowd knows a little about what they're getting into!&amp;nbsp; John Jakubowski (&lt;a href="http://johnjakubowski.wordpress.com/"&gt;blog&lt;/a&gt;|&lt;a href="http://twitter.com/@jjakubowski/"&gt;twitter&lt;/a&gt;) has graciously asked me to present on upsert strategies with SSIS.&amp;nbsp; What are "upserts"?&amp;nbsp; A not-so-fancy mashup of the words "update" and "insert".&lt;br /&gt;
If you struggle with incremental table loading performance - updating rows that already exist, and inserting rows that didn't - then you might want to drop by.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;When?&lt;/span&gt;&lt;br /&gt;
July 26th, 4pmGMT/12pm ET/9am PT&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Where?&lt;/span&gt;&lt;br /&gt;
Go to the &lt;a href="http://appdev.sqlpass.org/"&gt;PASS AppDev website&lt;/a&gt;, and find the LiveMeeting link.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What?&lt;/span&gt;&lt;br /&gt;
The full abstract:&lt;br /&gt;
One of the most sought after techniques in Integration Services is how to 
perform "upserts" - propagating changes from one system to another that may 
require new records to be inserted, or existing records to be updated. 
Integration Services can't accomplish this with a single click, but it does 
contain all the tools required to construct packages that will achieve this 
goal. The task of synchronizing data will be broken down into two parts: 
detecting changes, and updating or inserting. Refinements to use of the Lookup 
and alternatives to the OLE DB Command transform will be explored.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-3774846829210905264?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=kxL6dANWiNs:65ZgT3mpnEU:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=kxL6dANWiNs:65ZgT3mpnEU:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=kxL6dANWiNs:65ZgT3mpnEU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=kxL6dANWiNs:65ZgT3mpnEU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=kxL6dANWiNs:65ZgT3mpnEU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=kxL6dANWiNs:65ZgT3mpnEU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/kxL6dANWiNs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/3774846829210905264/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=3774846829210905264" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3774846829210905264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3774846829210905264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/kxL6dANWiNs/presenting-upserts-to-pass-appdev-vc.html" title="Presenting Upserts to PASS AppDev VC" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/07/presenting-upserts-to-pass-appdev-vc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MQnsycCp7ImA9WhdTEEk.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-168051297489243604</id><published>2011-07-07T06:26:00.000-07:00</published><updated>2011-07-07T07:44:43.598-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T07:44:43.598-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>What is Pipeline Backpressure?</title><content type="html">First - I'll get the "what's a pipeline got to do with Integration Services" question out of the way.&amp;nbsp; The "pipeline" I'm referring to here is the word commonly used to describe the flow of data in the Data Flow Task.&amp;nbsp; That term doesn't seem to show up in any of the MSDN documentation, but the Microsoft bloggers just &lt;a href="http://www.bing.com/search?q=site%3Ablogs.msdn.com+ssis+pipeline&amp;amp;go=&amp;amp;qs=n&amp;amp;sk=&amp;amp;form=QBLH&amp;amp;filt=all"&gt;can't seem to talk enough about it&lt;/a&gt;.&amp;nbsp; I suppose it's an internal term that's leaked out into general usage.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.flickr.com/photos/stephen_dyrgas/1469828976/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--EmsgQLvGA4/ThSaW1rpEEI/AAAAAAAAALY/5QxAGPDAcvY/s1600/1469828976_56b0339d73_m.jpg" /&gt;&lt;/a&gt;The SQL Server Integration Services' Data Flow Task reads data from one or more sources, flows that data through this "pipeline" where some parts of&amp;nbsp;it will get transformed (changed), and then sends the data&amp;nbsp;to one or more destinations.&amp;nbsp; The choice of the word "pipeline" will tend to get people thinking of a liquid in a pipe - and that's an apt metaphor for the phenomenon of &lt;a href="http://en.wikipedia.org/wiki/Backpressure"&gt;backpressure&lt;/a&gt;.&amp;nbsp; The same kind of action takes place in SSIS.&lt;/div&gt;&lt;span style="color: #e69138; font-size: large;"&gt;Fluid Backpressure&lt;/span&gt;&lt;br /&gt;
When talking about a liquid, backpressure refers to the resistance that the fluid encounters flowing through a pipe.&amp;nbsp; When the fluid encounters a constricted section of the pipe, it can't flow as fast through that section.&amp;nbsp; But since (most) fluids are incompressible and most pipes&amp;nbsp;are rigid, the reduction in flow rate at this constricted point means that the flow is "backed up" all the way to the start of the pipe.&amp;nbsp; If a kink is stopping the flow of water near the end of the hose, the tap isn't able to inject any more water into the hose - there's simply no space to put it.&amp;nbsp; The rate at which you can inject water into the hose is directly related to two things: how constricted the smallest part of the hose is, and how much the hose can "expand" prior to the blockage.&amp;nbsp; (If the hose can inflate like a balloon, you can still pump water in.)&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Data Flow Backpressure&lt;/span&gt;&lt;br /&gt;
SSIS's Data Flow Task has very similar constraints.&amp;nbsp; The source - or "tap" - wants to inject data into the pipeline as fast as it can.&amp;nbsp; But that data has to flow through the components - the "pipe" - in order to reach the destination - the "end" of the hose.&amp;nbsp;&amp;nbsp;Somewhat like a garden hose, the data flow pipeline&amp;nbsp;&lt;em&gt;can&lt;/em&gt; stretch to allow the source to inject more data into the pipeline than is ultimately getting through to the end.&amp;nbsp; But there's a limit, of course, just like with a hose.&amp;nbsp; If it's stretched too much, it will burst.&amp;nbsp; &lt;br /&gt;
In SSIS's case, since it's a "fictitious" hose, the nice engineers that built it&amp;nbsp;were able to set limits on how much of&amp;nbsp;a balloon you're allowed to turn your hose into.&amp;nbsp; It's the RAM limit of the process and/or machine you're running your package on.&amp;nbsp; In most cases, taking advantage of SSIS' "stretchy hose" is a very bad thing - you'll easily consume all the available memory on your machine, and start spilling into virtual memory... and that's slow disk!&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Backpressure In Action&lt;/span&gt;&lt;br /&gt;
Here's an SSIS package that demonstrates backpressure quite well.&amp;nbsp; &lt;br /&gt;
&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="https://skydrive.live.com/embedicon.aspx/Blog%20Photos%20^0%20Files/2011-07-08%20Backpressure%20Demo.dtsx?cid=0c76c3cbdb305921&amp;amp;sc=documents" style="background-color: #fcfcfc; height: 115px; padding: 0px; width: 98px;" title="Preview"&gt;&lt;/iframe&gt;&lt;br /&gt;
You can build your own quite easily from what I'll describe here, in case you don't have SSIS 2008.&amp;nbsp; The first task in it is a Data Flow Task that looks like this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RwNJ0W1BEOg/ThSbGCwKXLI/AAAAAAAAALc/N_oKjZkPqy4/s1600/2011-06-30+Free-flowing+%2528Design-Time%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-RwNJ0W1BEOg/ThSbGCwKXLI/AAAAAAAAALc/N_oKjZkPqy4/s1600/2011-06-30+Free-flowing+%2528Design-Time%2529.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;free-flowing designtime="" df=""&gt;The first component hooks up to your local instance's master database, fetching a cross-joined resultset from sysobjects.&amp;nbsp; (It's the volume of rows that matter here - not the content.)&amp;nbsp; The second component is one of my &lt;a href="http://toddmcdermid.blogspot.com/2011/06/code-snippet-for-ssis-dataflow.html"&gt;Data Flow wiretap scripts&lt;/a&gt; that will dump timing information to the logging stream that we'll be able to watch in the Output window.&amp;nbsp; The last component is a script destination.&amp;nbsp; Normally, I'd just use a Union All or Derived Column to cap the flow, but those result in a lot of "unused column" warnings that would clutter up the logging stream.&lt;/free-flowing&gt;&lt;br /&gt;
&lt;free-flowing designtime="" df=""&gt;As you can see below, running this flow results in something like this pretty quickly.&amp;nbsp; In my case, under 1.5 seconds, just about as quick as SQL Server can deliver the rows to SSIS.&amp;nbsp; (So fast I didn't bother to capture an "in-flight" picture.)&lt;/free-flowing&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-t-LoJWlUjV4/ThSkhWK3pAI/AAAAAAAAALg/5Aynd1wX3JA/s1600/2011-06-30+Free-flowing+%2528Runtime%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-t-LoJWlUjV4/ThSkhWK3pAI/AAAAAAAAALg/5Aynd1wX3JA/s1600/2011-06-30+Free-flowing+%2528Runtime%2529.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;free-flowing designtime="" df=""&gt;The next Data Flow Task in the package shows&amp;nbsp;how an "impeded" data flow will behave.&amp;nbsp; In this flow, there's one more script component in there.&lt;/free-flowing&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rCZpj2Z8m0Y/ThSlCZ53FSI/AAAAAAAAALk/siWmuXvmcX4/s1600/2011-06-30+Impeded+%2528Design-Time%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-rCZpj2Z8m0Y/ThSlCZ53FSI/AAAAAAAAALk/siWmuXvmcX4/s1600/2011-06-30+Impeded+%2528Design-Time%2529.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;free-flowing designtime="" df=""&gt;The component inserted at the third position is intended to mimic a transformation that takes effort to perform.&amp;nbsp; This is the equivalent of an uncached&amp;nbsp;Lookup, OLE DB Command, Merge Join, etc...&amp;nbsp; What does this look like at runtime?&amp;nbsp; Well, no problem taking&amp;nbsp;a screen capture in mid-execution on this one...&lt;/free-flowing&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uFg1JdvOTMw/ThSlp3iXC9I/AAAAAAAAALo/5CVb-wU930s/s1600/2011-06-30+Impeded+%2528Runtime%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-uFg1JdvOTMw/ThSlp3iXC9I/AAAAAAAAALo/5CVb-wU930s/s1600/2011-06-30+Impeded+%2528Runtime%2529.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;free-flowing designtime="" df=""&gt;How does this image show the effects of backpressure?&amp;nbsp; It was taken over 20 seconds after the data flow started.&amp;nbsp; Let me explain in more detail.&lt;/free-flowing&gt;&lt;br /&gt;
&lt;free-flowing designtime="" df=""&gt;Our first "free-flowing" data flow loaded the data into SSIS' pipeline in under 1.5 seconds.&amp;nbsp; The second "impeded" data flow hasn't even finished loading the 100K rows after 20 seconds... why not?&amp;nbsp; Because the "sleep" transform is slowing things down.&amp;nbsp; So why isn't the source simply reading as fast as it can, and piling up the data at the slow transform's doorstep?&amp;nbsp; Because if it did that, it would consume memory.&amp;nbsp; The developers of SSIS thought that consuming memory in this situation would be completely unnecessary if they could just tell the source to "slow down" to a manageable level... so they did.&lt;/free-flowing&gt;&lt;br /&gt;
&lt;free-flowing designtime="" df=""&gt;Any "execution tree" (there's another bit of SSIS internals jargon) will experience this backpressure - forcing every component to operate&amp;nbsp;no faster&amp;nbsp;than the slowest.&amp;nbsp; One of the key parts of managing the performance of your packages is understanding pipeline backpressure.&amp;nbsp; It can mislead you about what's performing slowly in your flow, causing you to spend time and effort where it will have no effect.&amp;nbsp; Tweaking the DefaultBufferSize and DefaultBufferMaxRows properties can change some of the effects of backpressure - but doing so only delays the inevitable with sufficiently large data sets, and typically offers little meaningful benefit.&amp;nbsp; The real key is understanding your data flow's behaviour through decomposition.&lt;/free-flowing&gt;&lt;br /&gt;
&lt;free-flowing designtime="" df=""&gt;I have one more example data flow for you in the package, where I add a sort component to the middle of the flow.&amp;nbsp; How will this affect the flow of data?&amp;nbsp; The sleep component will definitely cause the end-to-end flow to be slow, but will the source stream quickly like the "free-flowing" example, or will it be throttled like the "impeded" flow?&amp;nbsp; I'll leave that up to you to explain...&lt;/free-flowing&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-168051297489243604?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=35Shuz-ZrjY:wfmLGHyQJSY:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=35Shuz-ZrjY:wfmLGHyQJSY:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=35Shuz-ZrjY:wfmLGHyQJSY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=35Shuz-ZrjY:wfmLGHyQJSY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=35Shuz-ZrjY:wfmLGHyQJSY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=35Shuz-ZrjY:wfmLGHyQJSY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/35Shuz-ZrjY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/168051297489243604/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=168051297489243604" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/168051297489243604?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/168051297489243604?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/35Shuz-ZrjY/what-is-pipeline-backpressure.html" title="What is Pipeline Backpressure?" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/--EmsgQLvGA4/ThSaW1rpEEI/AAAAAAAAALY/5QxAGPDAcvY/s72-c/1469828976_56b0339d73_m.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/07/what-is-pipeline-backpressure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAMQH0zeSp7ImA9WhZbFUU.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4507445196290313400</id><published>2011-06-20T05:56:00.000-07:00</published><updated>2011-06-20T08:13:01.381-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T08:13:01.381-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Scripting" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practice" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Code Snippet for an SSIS DataFlow Performance Wiretap</title><content type="html">I was recently tweaking a few Data Flows, and settled on a very small, but very useful script to help record execution timing inside the flow.&amp;nbsp; &lt;br /&gt;
&lt;div style="border: currentColor;"&gt;&lt;a href="http://public.blu.livefilestore.com/y1plKe6ACmVd7jIcG0iilYj7t1l3zO6WUio5J7ypy3UCA9WSUYQZpqKwnpLI9QO_MOYVz5N5JxS5ty7a1GjFCNpAA/2011-06-20%20Stopwatch.jpg?psid=1" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" i$="true" src="http://public.blu.livefilestore.com/y1plKe6ACmVd7jIcG0iilYj7t1l3zO6WUio5J7ypy3UCA9WSUYQZpqKwnpLI9QO_MOYVz5N5JxS5ty7a1GjFCNpAA/2011-06-20%20Stopwatch.jpg?psid=1" /&gt;&lt;/a&gt;&lt;span style="color: #e69138; font-size: large;"&gt;Decomposition Is Time Consuming&lt;/span&gt;&lt;/div&gt;&lt;div style="border: currentColor;"&gt;You may know that I do recommend the decomposition technique to help diagnose performance problems in SSIS data flows.&amp;nbsp; That's the technique where you start recording execution times using fewer and fewer components in the data flow in order to get a differential execution time for particular components.&amp;nbsp; Even though it's not perfect, it does account for misleading effects of the pipeline backpressure mechanism.&amp;nbsp; (What I suggest later does not.)&lt;/div&gt;Unfortunately, performing a decomposition analysis can take quite a while.&amp;nbsp; It is time consuming to replace the destination component with a row count, run the flow, record the results, and continue up the flow.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Adding a Performance Wiretap is Easy&lt;/span&gt;&lt;br /&gt;
Especially when the code is completely copy-and-paste!&amp;nbsp; I couldn't measure any performance impact of including this script code, and didn't expect any.&amp;nbsp; It doesn't use any columns in the data flow, and the operations it does do are very lightweight.&amp;nbsp; You don't even have to change anything in the script itself - the events that are logged include the name you give the component in the data flow (which must be unique) so you can easily identify which of several wiretaps is reporting information.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
public class ScriptMain : UserComponent&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#region Statistic collectors&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private DateTime _preExecuteTime;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private DateTime _firstRowTime;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private DateTime _lastRowTime;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private int _numRows;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#region PreExecute&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// This method is called before any rows are read from any sources&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// We reset all statistics here&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public override void PreExecute()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.PreExecute();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._firstRowTime = DateTime.MinValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._lastRowTime = DateTime.MinValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._numRows = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#region ProcessInput&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// This is NOT a regular method override you normally see in a script component&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// This override is called once for each input buffer (set of rows) that&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// are passed into this script component. We count rows here, and record&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// first and last "row seen times".&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.ProcessInput(InputID, Buffer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Record the time the first row was seen&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (this._firstRowTime == DateTime.MinValue)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._firstRowTime = DateTime.Now;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region If this buffer has any rows (the last buffer typically does NOT), record the time&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Buffer.RowCount &amp;gt; 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._lastRowTime = DateTime.Now;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Add the number of rows in this buffer to the row count statistic&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this._numRows += Buffer.RowCount;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#region PostExecute&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public override void PostExecute()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool fireAgain = true;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.PostExecute();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Output statistics to package logging, as Information events&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.Name + " first row seen at " + this._firstRowTime.ToString("hh:mm:ss.fff"),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"", 0, ref fireAgain);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.Name + " last row seen at " + this._lastRowTime.ToString("hh:mm:ss.fff"),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"", 0, ref fireAgain);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TimeSpan duration = (this._lastRowTime - this._firstRowTime);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.Name + " watched " + this._numRows.ToString("###,###,##0") + " rows pass by in " + duration.TotalMilliseconds.ToString() + "ms",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"", 0, ref fireAgain);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
So what does it do?&amp;nbsp; It records the time the first row passes it, the number of rows that go by, and the time the last row passes it.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How Can This Help Diagnose Performance?&lt;/span&gt;&lt;br /&gt;
If you want to know which section of your Data Flow takes the longest duration - place some of these scripts at various places in the flow.&amp;nbsp; After you run your Data Flow, you'll see how long each section takes&amp;nbsp;- keepin gin mind their execution times will overlap each other.&amp;nbsp; (If you use two scripts, the second script's "first row" may very well be seen before the "last row" passes through the first script.)&lt;br /&gt;
If you're wondering what kind of impact a certain change has in your Data Flow - place this script before and after the affected area.&amp;nbsp; Run your flow before you make the change, and again after.&amp;nbsp; The results will show you how much impact your change had (but remember it won't account for hidden&amp;nbsp;backpressure effects!)&lt;br /&gt;
If you're wondering which of&amp;nbsp;several "branches" of&amp;nbsp;a Data Flow that are combined using a Union All is the slowest, you can use these wiretaps to instrument each one.&lt;br /&gt;
Once again - please don't think this is a replacement for correct use of the decomposition technique.&amp;nbsp; Component performance in the Data Flow depends heavily on other components coming before and&amp;nbsp;after the area you're interested in - and even flows occurring in parallel in the same (or other) Data Flow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4507445196290313400?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw5dsXhkDNY:roi_YHQNG0s:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Zw5dsXhkDNY:roi_YHQNG0s:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw5dsXhkDNY:roi_YHQNG0s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw5dsXhkDNY:roi_YHQNG0s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw5dsXhkDNY:roi_YHQNG0s:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Zw5dsXhkDNY:roi_YHQNG0s:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/Zw5dsXhkDNY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4507445196290313400/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4507445196290313400" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4507445196290313400?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4507445196290313400?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/Zw5dsXhkDNY/code-snippet-for-ssis-dataflow.html" title="Code Snippet for an SSIS DataFlow Performance Wiretap" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/06/code-snippet-for-ssis-dataflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEARHc6eip7ImA9WhdVEkw.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-2322165150672661753</id><published>2011-06-06T09:16:00.000-07:00</published><updated>2011-09-16T15:54:05.912-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-16T15:54:05.912-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Office" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>How Do You Deal with Excel in SSIS?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://public.blu.livefilestore.com/y1ppPCoStx-Ks7disiDZVWP8dvpUUfc7IuWTULlNOkEe5JobjBc8rUo9tFEpJDjC6dB7eV_w2XN8B7DM-l8bFU2lw/PASS%20Logo.gif?psid=1" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://public.blu.livefilestore.com/y1ppPCoStx-Ks7disiDZVWP8dvpUUfc7IuWTULlNOkEe5JobjBc8rUo9tFEpJDjC6dB7eV_w2XN8B7DM-l8bFU2lw/PASS%20Logo.gif?psid=1" /&gt;&lt;/a&gt;This Friday June 10th, I'll be presenting to the &lt;a href="http://vancouverbi.sqlpass.org/"&gt;Vancouver BI PASS&lt;/a&gt; chapter about Excel.&amp;nbsp; I've got a TON of problems, solutions, resources and tips to compile together - Excel can be a real finicky beast to deal with from an automation standpoint.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://public.blu.livefilestore.com/y1p6szEkfhNCeCoDQkE6YwPDJiFcJWgamoNv2d9vROO3QcYw9sR3hINBlb1Vx3w676CCX_cYxPUYDjV6XjUwwKiag/Excel%20Logo.jpg?psid=1" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://public.blu.livefilestore.com/y1p6szEkfhNCeCoDQkE6YwPDJiFcJWgamoNv2d9vROO3QcYw9sR3hINBlb1Vx3w676CCX_cYxPUYDjV6XjUwwKiag/Excel%20Logo.jpg?psid=1" width="200" /&gt;&lt;/a&gt;Given all the problems with connectivity, data types, formatting, and so on... why don't&amp;nbsp;ETL developers&amp;nbsp;just proclaim that&amp;nbsp;they won't take data in the form of Excel spreadsheets?&amp;nbsp; Because then we'd have no work to do!&amp;nbsp; It's pretty uncommon to hear of a data&amp;nbsp;integration project that doesn't involve Excel in part of it.&amp;nbsp; The source OLTP system probably isn't a set of spreadsheets&amp;nbsp;- but quite a lot of supporting metadata, reference information, or budgets and forecasts come from the ubiquitous Excel.&amp;nbsp; It's the business' most comfortable vehicle for storing data - I constantly hear it referred to as a "database" (by business folks).&amp;nbsp; Well, we can't snigger from on high in our ivory tower about how rediculous it is to call Excel spreadsheets databases - we have to deal with this data!&lt;/div&gt;The presentation will be in the Microsoft offices in downtown Vancouver - 1111 West Georgia, 11th floor at 10:30 PDT.&amp;nbsp; Come early to chat&amp;nbsp;- I'll be there around 10am, depending on how long a conference call goes.&amp;nbsp; I hope to see you there if you're a local - but if not, you can still tune in virtually.&amp;nbsp; Scott will have the RSVP and LiveMeeting links up on the &lt;a href="http://vancouverbi.sqlpass.org/"&gt;Vancouver BI PASS&lt;/a&gt; website shortly.&lt;br /&gt;
And for those that are really paying attention - if there's a specific issue you're interested in solving between SSIS and Excel, ask away during the presentation - or be nice to me and leave a comment here prior to Friday so I come prepared!&lt;br /&gt;
&lt;strong&gt;UPDATE 2011-06-22&lt;/strong&gt;: The &lt;a href="https://skydrive.live.com/?cid=0c76c3cbdb305921&amp;amp;sc=documents&amp;amp;id=C76C3CBDB305921%211310#"&gt;recording&lt;/a&gt;, &lt;a href="https://skydrive.live.com/?cid=0c76c3cbdb305921&amp;amp;sc=documents&amp;amp;id=C76C3CBDB305921%211310#"&gt;samples&lt;/a&gt;, and &lt;a href="https://skydrive.live.com/redir.aspx?cid=0C76C3CBDB305921&amp;amp;resid=C76C3CBDB305921%211310&amp;amp;page=view"&gt;slide deck&lt;/a&gt; are now available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-2322165150672661753?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=US_A0-CzlT0:tnr9KPbRzDs:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=US_A0-CzlT0:tnr9KPbRzDs:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=US_A0-CzlT0:tnr9KPbRzDs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=US_A0-CzlT0:tnr9KPbRzDs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=US_A0-CzlT0:tnr9KPbRzDs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=US_A0-CzlT0:tnr9KPbRzDs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/US_A0-CzlT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/2322165150672661753/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=2322165150672661753" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2322165150672661753?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2322165150672661753?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/US_A0-CzlT0/how-do-you-deal-with-excel-in-ssis.html" title="How Do You Deal with Excel in SSIS?" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/06/how-do-you-deal-with-excel-in-ssis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcGQX4_eCp7ImA9WhZVGEk.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-1313094019751539105</id><published>2011-05-31T05:47:00.000-07:00</published><updated>2011-05-31T05:47:00.040-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T05:47:00.040-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Scripting" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practice" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Use Connections Properly in an SSIS Script Task</title><content type="html">There are lots of scenarios in SSIS where you'd want to use a connection within a Script Task.&amp;nbsp; Unfortunately, the closest help documentation - the comments inside the Script Task itself - give you exceptionally poor advice:&lt;br /&gt;
&lt;span style="color: #6aa84f; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;To use the connections collection use something like the following:&lt;br /&gt;
ConnectionManager cm = Dts.Connections.Add("OLEDB");&lt;br /&gt;
cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Why is this advice bad?&amp;nbsp; Let me count the ways:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The connection string is hardcoded inside the&amp;nbsp;script.&lt;/li&gt;
&lt;li&gt;The connection can't be used with Package Configurations.&lt;/li&gt;
&lt;li&gt;The connection string (and name) imply that OLEDB connections can be used.&lt;/li&gt;
&lt;li&gt;As presented, the connection won't participate in MSDTC transactions.&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-size: x-small;"&gt;(And seriously, "use something like the following"?&amp;nbsp; Hey - I write the vague blog posts here.&amp;nbsp; They're supposed to be writing &lt;em&gt;documentation&lt;/em&gt;. ;) )&lt;/span&gt;&lt;br /&gt;
The poor advice boils down to the fact that it appears to create a "managed" connection, but doesn't truly do so.&amp;nbsp; In fact, if you attempt to use code in the comment as is - you're only halfway there.&amp;nbsp; How do you actually use this "ConnectionManager" object anyway?&amp;nbsp; There's no "Open" method, or Command object - just&amp;nbsp;weird methods and properties that would be entirely unfamiliar to you even if you know .Net data access!&amp;nbsp; And to add insult to injury, even if you did know where to go from here, the example provided will only cause an error, and will never work.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What is a Managed Connection?&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1ph6_QI-eLOgUmuJ9oRuf2F7TLJfNxApAIPLpYnSLerMmBGYWkFwlcs-9aOwfpDwC0kr3YXFW_Rb-6zB4QuUt_0KmXFB57onNJ/2011-05-31%20BIDS%20Window.jpg?psid=1" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="191" src="http://7y0rtw.blu.livefilestore.com/y1ph6_QI-eLOgUmuJ9oRuf2F7TLJfNxApAIPLpYnSLerMmBGYWkFwlcs-9aOwfpDwC0kr3YXFW_Rb-6zB4QuUt_0KmXFB57onNJ/2011-05-31%20BIDS%20Window.jpg?psid=1" width="320" /&gt;&lt;/a&gt;Lets start with describing what&amp;nbsp;a "managed" connection is&amp;nbsp;(in the context of SQL Server Integration Services).&amp;nbsp; It is simply a connection that's defined and controlled by an entry in the "Connection Managers" window at the bottom of the design surface in BIDS.&lt;/div&gt;Managed connections have the following benefits:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Their properties (primarily the connection string)&amp;nbsp;can be manipulated with Package Configurations.&lt;/li&gt;
&lt;li&gt;Their properties (again, the connection string) can be manipulated with Property Expressions.&lt;/li&gt;
&lt;li&gt;They can participate in SSIS (MSDTC) transactions.&lt;/li&gt;
&lt;li&gt;The connection&amp;nbsp;is tested by default when the package is loaded, before any (potentially unrecoverable) work is started.&lt;/li&gt;
&lt;/ul&gt;But perhaps most importantly, using a managed connection within a script (properly) informs someone maintaining the package that a connection to an external resource is being used.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How is the Advice Wrong?&lt;/span&gt;&lt;br /&gt;
The comment in the Script Task counsels you to use &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.connections.add.aspx"&gt;Dts.Connections.Add&lt;/a&gt; to get a reference to a &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.connectionmanager.aspx"&gt;ConnectionManager&lt;/a&gt; object.&amp;nbsp; This is the correct type of object - it's a managed connection.&amp;nbsp; Unfortunately, using that syntax, you're creating a new one, &lt;em&gt;not&lt;/em&gt; using one of the managed connections you've already defined in the package.&amp;nbsp; Since it's an entirely&amp;nbsp;new connection, you have to&amp;nbsp;set up&amp;nbsp;the connection string.&amp;nbsp; You could pass the connection string in to the script using an SSIS variable, or read it from a file - but these are both non-standard practices.&amp;nbsp; Another ETL developer or administrator familiar with SSIS won't anticipate your decision to implement&amp;nbsp;a&amp;nbsp;connection&amp;nbsp;that way.&lt;br /&gt;
Additionally, since it's a brand new object, none of the regular design time facilities are available to you; Package Configurations, Property Expressions, the TransactionOption property, and runtime validation don't work.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Right Way to Use Managed Connections&lt;/span&gt;&lt;br /&gt;
Ignore the comments in the Script Task - use managed connections properly by following these steps.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;1. Create an ADO.Net&amp;nbsp;Connection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Add a Connection Manager to your package the same way you'd make one for use in a Data Flow or Execute SQL Task.&amp;nbsp; Right-click in the Connection Managers pane and add a new ADO.Net connection.&amp;nbsp; You &lt;a href="http://blogs.msdn.com/b/mattm/archive/2008/08/22/accessing-oledb-connection-managers-in-a-script.aspx"&gt;can use OLEDB type connections&lt;/a&gt; and other connection types - but they're more difficult to use and&amp;nbsp;have fewer capabilities&amp;nbsp;inside a Script.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;2. Retrieve a Reference to the Connection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Inside your Script Task, instead of using Dts.Connections.Add, retrieve a reference to an existing connection manager by using the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.connections.item.aspx"&gt;Dts.Connections indexer&lt;/a&gt;.&amp;nbsp; For example, if you happen to have a connection manager named "(local).master", then use this code to retrieve a reference to the ConnectionManager object:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;&lt;span style="color: #45818e;"&gt;ConnectionManager&lt;/span&gt; cm = Dts.Connections[&lt;span style="color: #cc0000;"&gt;"(local).master"&lt;/span&gt;];&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;3. For Connections with Providers, Acquire a Connection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
(A "provider" means any connection that has code supporting and managing the connection - like an ADO, OLEDB, or Excel connection, but unlike a Flat File connection.)&lt;br /&gt;
Even though you now have a reference to the ConnectionManager object, you need to acquire an actual connection to the resource, and request that connection be established in a way that SSIS can manage it.&amp;nbsp; This step is necessary to ensure that your work with the connection participates in transactions and connection pooling (or lack of it).&lt;br /&gt;
The specific details for each connection type vary, but the general method is consistent.&lt;br /&gt;
&lt;span style="color: #6aa84f; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;// For an ADO.Net ConnectionManager using a SqlClient provider&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlConnection&lt;/span&gt; sqlConn = (System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlConnection&lt;/span&gt;)cm.AcquireConnection(Dts.Transaction);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #6aa84f; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;// For an ADO.Net ConnectionManager using an ODBC provider&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;System.Data.Odbc.&lt;span style="color: #45818e;"&gt;OdbcConnection&lt;/span&gt; odbcConn = (System.Data.Odbc.&lt;span style="color: #45818e;"&gt;OdbcConnection&lt;/span&gt;)cm.AcquireConnection(Dts.Transaction);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;Be aware that it is NOT necessary (or advisable) to use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx"&gt;Open&lt;/a&gt; method on the connection object you just retrieved... it's already open.&amp;nbsp; (Check the connection's &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state.aspx"&gt;State&lt;/a&gt; property if you don't believe me.)&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;4. Use the Connection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
At this point, you can use the connection to retrieve &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx"&gt;datasets&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx"&gt;execute commands&lt;/a&gt;, or do just about anything else you'd want to do with your connection.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;5. Release the Connection Properly&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Once you've finished your work, you need to clean up after yourself - but NOT by using the Close method on the connection!&amp;nbsp; You'll need to use the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.connectionmanager.releaseconnection.aspx"&gt;ReleaseConnection&lt;/a&gt; method of the ConnectionManager instead.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How Hard Was That?&lt;/span&gt;&lt;br /&gt;
Hopefully not so hard as to make you want to go the other direction and use completely unmanaged connections in your scripts!&amp;nbsp; To recap, here's a complete code listing of how to correctly use an ADO.Net managed connection for a SqlClient provider within a Script Task:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt; fireAgain = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color: #45818e;"&gt;ConnectionManager&lt;/span&gt; cm;&lt;br /&gt;
System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlConnection&lt;/span&gt; sqlConn;&lt;br /&gt;
System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlCommand&lt;/span&gt; sqlComm;&lt;br /&gt;
int rowsAffected;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;&lt;span style="color: #6aa84f;"&gt;// Retrieve the reference to the managed connection&lt;/span&gt;&lt;br /&gt;
cm = Dts.Connections[&lt;span style="color: #cc0000;"&gt;"(local).master"&lt;/span&gt;];&lt;br /&gt;
&lt;span style="color: #6aa84f;"&gt;// Request an open connection&lt;/span&gt;&lt;br /&gt;
sqlConn = (System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlConnection&lt;/span&gt;)cm.AcquireConnection(Dts.Transaction);&lt;br /&gt;
Dts.Events.FireInformation(0, &lt;span style="color: #cc0000;"&gt;""&lt;/span&gt;, &lt;span style="color: #cc0000;"&gt;"Connection is: "&lt;/span&gt; + sqlConn.State.ToString(), &lt;span style="color: #cc0000;"&gt;""&lt;/span&gt;, 0, &lt;span style="color: blue;"&gt;ref&lt;/span&gt; fireAgain);&lt;br /&gt;
&lt;span style="color: #6aa84f;"&gt;// Do your work&lt;/span&gt;&lt;br /&gt;
sqlComm = new System.Data.SqlClient.&lt;span style="color: #45818e;"&gt;SqlCommand&lt;/span&gt;&lt;span style="color: #cc0000;"&gt;("UPDATE YourTable SET&amp;nbsp;YourColumn = 'SomeValue'"&lt;/span&gt;, sqlConn);&lt;br /&gt;
rowsAffected = sqlComm.ExecuteNonQuery();&lt;br /&gt;
&lt;span style="color: #6aa84f;"&gt;// Inform SSIS you're done your work&lt;/span&gt;&lt;br /&gt;
cm.ReleaseConnection(sqlConn);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
Dts.Events.FireInformation(0, &lt;span style="color: #cc0000;"&gt;""&lt;/span&gt;, rowsAffected.ToString() + &lt;span style="color: #cc0000;"&gt;" rows updated."&lt;/span&gt;, &lt;span style="color: #cc0000;"&gt;""&lt;/span&gt;, 0, &lt;span style="color: blue;"&gt;ref&lt;/span&gt; fireAgain);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
Dts.TaskResult = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)&lt;span style="color: #45818e;"&gt;ScriptResults&lt;/span&gt;.Success;&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-1313094019751539105?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IkZOee1n288:q70t9Gw9bqA:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=IkZOee1n288:q70t9Gw9bqA:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IkZOee1n288:q70t9Gw9bqA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IkZOee1n288:q70t9Gw9bqA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IkZOee1n288:q70t9Gw9bqA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=IkZOee1n288:q70t9Gw9bqA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/IkZOee1n288" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/1313094019751539105/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=1313094019751539105" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1313094019751539105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1313094019751539105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/IkZOee1n288/use-connections-properly-in-ssis-script.html" title="Use Connections Properly in an SSIS Script Task" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/use-connections-properly-in-ssis-script.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIEQX8yeip7ImA9WhZVEkk.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-3465684168876763830</id><published>2011-05-24T05:35:00.000-07:00</published><updated>2011-05-24T05:35:00.192-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-24T05:35:00.192-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Analysis Services (SSAS)" /><category scheme="http://www.blogger.com/atom/ns#" term="Quick Reference" /><title>Idiot's Guide to SSAS Attribute Relationships</title><content type="html">Yes, that's me - and this is a reference post because frankly, this stuff is too complicated to keep in my head for how frequently I use it.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Problem&lt;/span&gt;&lt;br /&gt;
﻿ &lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://8s0vtw.blu.livefilestore.com/y1pzI2OHV_O94q--P6OZHjDaUq_tdUPRWbe8Bzw0AR5E3LSoD2mRfhz9XdgEpEfTHO7APFN-yx0VMDs1TrZzTxjy3sf7yhlQmO-/Headshot.jpg?psid=1" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200px" j8="true" src="http://8s0vtw.blu.livefilestore.com/y1pzI2OHV_O94q--P6OZHjDaUq_tdUPRWbe8Bzw0AR5E3LSoD2mRfhz9XdgEpEfTHO7APFN-yx0VMDs1TrZzTxjy3sf7yhlQmO-/Headshot.jpg?psid=1" width="140px" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The SSAS Idiot&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;﻿When you get the "Errors in the OLAP storage engine: The attribute key cannot be found when processing." error returned when you're trying to process an SSAS cube, what does that really mean?&amp;nbsp; I have a &lt;a href="http://toddmcdermid.blogspot.com/2009/01/ssas-quick-reference-attribute-key.html"&gt;previous post&lt;/a&gt; where I went into some more technical reasons that can cause this error, but there's usually a pretty simple cause related to how you've structured your dimension in the designer... your attribute relationships. &lt;span style="color: #e69138; font-size: large;"&gt;Attribute Relationships&lt;/span&gt;&lt;br /&gt;
Specifying good attribute relationships are something that the experts say are a very basic and necessary step to configuring a cube that performs well.&amp;nbsp; Attribute relationships tell SSAS that it can take some shortcuts when processing your cube.&amp;nbsp; What kind of shortcuts?&amp;nbsp; Something like telling it that since "British Columbia", "Alberta", "Saskatchewan",&amp;nbsp;and all the other provinces&amp;nbsp;are always in "Canada", if you (or a user) asks for a total sales number for Canada, it doesn't have to add up all the invoice line items for Canada - it can go add up the numbers it's stored already for total sales in each province.&lt;br /&gt;
So yes, it's very good to specify attribute relationships!&amp;nbsp; It can turn a million row operation into a ten row operation, which results in better query performance, reduced storage requirements, faster cube processing, and more.&amp;nbsp; It's a best practice to relate attributes that you've placed in a dimension Hierarchy - because they're going to be used in aggregations very often.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How Are Attribute Relationships Related to the Problem? (Pun Intended)&lt;/span&gt;&lt;br /&gt;
In the example of provinces and countries I provided, it seems like you'd never have a problem - it's straightforward and simple, right?&amp;nbsp; Not so fast.&amp;nbsp; You could have bad data... or not such a simple relationship.&amp;nbsp; We'll look at both in turn.&lt;br /&gt;
What do I mean by "bad data"?&amp;nbsp; I mean that your data warehouse&amp;nbsp;could have business entities that have bad address information delivered to it by your OLTP system(s).&amp;nbsp; (You're shocked, I know.)&amp;nbsp; Bad how?&amp;nbsp; Perhaps address information is incomplete - it only has the country, they didn't bother to fill in the street, city, or province.&amp;nbsp; Bad, bad, OLTP data entry validation!&amp;nbsp; But it happens... all too often.&amp;nbsp; This means that a "blank"&amp;nbsp;province could be located in multiple countries.&lt;br /&gt;
What do I mean by "not a simple relationship"?&amp;nbsp; Let's take another example - cities.&amp;nbsp; There's only one Vancouver, right?&amp;nbsp; The one in British Columbia, Canada.&amp;nbsp; Not so fast... &lt;a href="http://en.wikipedia.org/wiki/Vancouver,_Washington"&gt;Vancouver, WA&lt;/a&gt; would be having words about that assertion.&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/List_of_the_most_common_U.S._place_names"&gt;Other city names are much more prevalent&lt;/a&gt;, and easily demonstrate this particular issue.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Deciphering SSAS's Error Message&lt;/span&gt;&lt;br /&gt;
OK - so you understand the problem when I explain it with my example... but how do you decipher SSAS's message to figure out how your attribute relationships and your data are causing problems?&amp;nbsp; Here's the long explanation - I'll cover it again more briefly at the conclusion of the post.&amp;nbsp; My error message looks like this:&lt;br /&gt;
&lt;span style="color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&lt;strong&gt;Errors in the OLAP storage engine: A duplicate attribute key has been found when processing: Table: 'dbo_vDIM_CUSTOMER', Column: 'ship_to_city', Value: 'Greenland'. The attribute is 'Ship To City'.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
To genericize it, I'll replace the actual values with placeholder names that I'll use going forward:&lt;br /&gt;
&lt;span style="color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&lt;strong&gt;Errors in the OLAP storage engine: A duplicate attribute key has been found when processing: Table: 'DimensionTable', Column: 'AttributeColumn', Value: 'AttributeValue'. The attribute is 'AttributeName'.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Find the "Source Attribute"&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Breaking it down, this message means that the attribute in your SSAS dimension&amp;nbsp;called AttributeName, and that's where the problem is.&amp;nbsp; We'll refer to this as the Source Attribute.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Find the "Related Attribute"&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Open BIDS open the dimension that didn't process, and switch to the Attribute Relationships tab - the one with the graph that looks like this (based on my example):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1p6KsxCQuzhahyqql4R_MyiBqfHhZAYALeAh19tvFWyK-rqEiqcI1il1tRqF6Sa0hE7LBbLmrDDRP91RMmq-NjI4VCt9jyL2vs/2011-05-24%20Attribute%20Relationship%20Graph.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="33px" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1p6KsxCQuzhahyqql4R_MyiBqfHhZAYALeAh19tvFWyK-rqEiqcI1il1tRqF6Sa0hE7LBbLmrDDRP91RMmq-NjI4VCt9jyL2vs/2011-05-24%20Attribute%20Relationship%20Graph.jpg?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;(Now, why the "Ship To City" attribute is in a separate box from the "Dim Customer Key" attribute, but the "Ship To State Province Code" isn't is not something I can explain, so I won't.)&amp;nbsp; Looking at the list view (down below), I see this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pQPg6DUIb9tiw5PJA5SurjSIlGeZMPOb2ZsrdSwp253f9e7c7HAifse-KeBRH8jOuhRT2_sFKr8TVlJVypdi80rsUwTuzrSYn/2011-05-24%20Attribute%20Relationship%20List.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="66px" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1pQPg6DUIb9tiw5PJA5SurjSIlGeZMPOb2ZsrdSwp253f9e7c7HAifse-KeBRH8jOuhRT2_sFKr8TVlJVypdi80rsUwTuzrSYn/2011-05-24%20Attribute%20Relationship%20List.jpg?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;The important things to notice is that the Source Attribute (in my case) was Ship To City, and it's being "rolled up" or "is contained in" the Ship To State Province Code.&amp;nbsp; In your case, you need to find the Source Attribute in your relationship graph or list, and find out what other attributes it's related to.&amp;nbsp; (There might be more than one relationship where your Source Attribute is on the left-hand-side of an arrow.&amp;nbsp; You'll have to investigate each relationship individually.)&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Find the "Source Column" in the Dimension Table&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Your Source Attribute came from somewhere in your underlying dimensional database - find out where.&amp;nbsp; You're given a hint in the error message - the AttributeColumn.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Find the "Related Column" in the Dimension Table&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Just like the Source Attribute, the Related Attribute comes from a dimensional database table - find out where.&amp;nbsp; You'll likely have to switch to the Dimension Structure tab of the dimension editor, select the Related Attribute, open the Properties window (F4), and look at the KeyColumns property.&lt;br /&gt;
Now you're ready to query your data.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Querying Your Data&lt;/span&gt;&lt;br /&gt;
You now have&amp;nbsp;three critical pieces of information: the Source Column, Related Column, and AttributeValue.&amp;nbsp; In my case, the Source Column was "ship_to_city" in my vDIM_CUSTOMER view, the Related Column was "ship_to_state_province_code" in the same view, and the offending AttributeValue was 'Greenland'.&amp;nbsp; To find out why SSAS is having a problem, I need to run this query:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;ship_to_city&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;ship_to_state_province_code&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: magenta;"&gt;COUNT&lt;/span&gt;&lt;span style="color: grey;"&gt;(*)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: grey;"&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;vDIM_CUSTOMER&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;WHERE &lt;/span&gt;&lt;span style="color: black;"&gt;ship_to_city = &lt;/span&gt;&lt;span style="color: red;"&gt;'Greenland'&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;GROUP BY &lt;/span&gt;&lt;span style="color: black;"&gt;ship_to_city, ship_to_state_province_code&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
To genericize the query and relate it to those placeholder names we've been using, it should look like this:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;[Source Attribute]&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;[Related Attribute]&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: magenta;"&gt;COUNT&lt;/span&gt;&lt;span style="color: grey;"&gt;(*)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: grey;"&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;[DimensionTable]&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;WHERE &lt;/span&gt;&lt;span style="color: black;"&gt;[Source Attribute] = &lt;/span&gt;&lt;span style="color: red;"&gt;AttributeValue&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;GROUP BY &lt;/span&gt;&lt;span style="color: black;"&gt;[Source Attribute], [Related Attribute]&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
When I run that, I got 2 rows back - it shows quite clearly what my problem was:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pvQurz2OyGvQwCKHCDP3nYXQQsGbnbax5kFsNQkHpUmzQKm4DxCB9QN6BvV822NSJ36Jy4c0A5NpKwjlSSIBBe7tHjA5aduc2/2011-05-24%20Bad%20Data.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="51px" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1pvQurz2OyGvQwCKHCDP3nYXQQsGbnbax5kFsNQkHpUmzQKm4DxCB9QN6BvV822NSJ36Jy4c0A5NpKwjlSSIBBe7tHjA5aduc2/2011-05-24%20Bad%20Data.jpg?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;Yep - OLTP addresses where sometimes the city was specified on a customer record, but the&amp;nbsp;state or province&amp;nbsp;wasn't.&amp;nbsp; In your case, you should get at LEAST two rows from your query.&amp;nbsp; If you don't - then this isn't your problem... maybe you have &lt;a href="http://toddmcdermid.blogspot.com/2009/01/ssas-quick-reference-attribute-key.html"&gt;one of these problems&lt;/a&gt; instead.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Knowing Is Half The Battle&lt;/span&gt;&lt;br /&gt;
Fantastic, now that you know where the problem is, you can fix it.&amp;nbsp; How?&amp;nbsp; One of two ways:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Decide it's a "data problem" and&amp;nbsp;rectify the underlying data.&amp;nbsp; Tell a business user to fix the offending address, tell the OLTP developer to add validation to customer address entry, and/or change your ETL process to clean the data.&lt;/li&gt;
&lt;li&gt;Decide the data will never get "clean" - because nobody will "own" the dirt, or because it's a valid part of the business.&amp;nbsp; This happens very often.&lt;/li&gt;
&lt;/ol&gt;In my case, the data you see&amp;nbsp;&lt;em&gt;is&lt;/em&gt; dirty.&amp;nbsp; But the offending business data is very old, and not worth cleaning up.&amp;nbsp; If I did spend the time to clean up the blanks, I would still be unable to process my cube, because I would find "Springfield" in multiple states, etc...&amp;nbsp; So even though it is dirty, it is also a business reality that cities don't uniquely belong to state/provinces.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Other Half - Fixing The Attributes&lt;/span&gt;&lt;br /&gt;
So if I can't clean the data because it is (mostly) how it's supposed to be... how can I model it in SSAS?&amp;nbsp; I recognize that certain cities are related to multiple states and provinces... but I still want to (and should) help SSAS optimize it's processing.&lt;br /&gt;
I'm sure there are several ways (there always are) - but the following works for me.&amp;nbsp; If an SSAS expert would like to chime in, please do!&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Recognize That "AttributeColumn" Isn't Unique&lt;/span&gt;&lt;br /&gt;
We have to recognize that the Source Attribute doesn't uniquely identify the Reference Attribute.&amp;nbsp; Just because I say "Vancouver" doesn't always mean I'm referring to the city in British Columbia.&amp;nbsp;&amp;nbsp;I'm going to have to uniquely identify cities in order to roll them up into states and provinces, just like you'll have to uniquely identify Source Attributes in order to roll them up into Reference Attributes.&lt;br /&gt;
How do we do that?&lt;br /&gt;
Inside BIDS, open the Dimension and select the Dimension Structure tab.&amp;nbsp; Select the Source Attribute from the list and open the Properties window (F4).&amp;nbsp; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1p4HaVMofyres0xl5Ysq1mHdJ40NZ68i_zOJCfJEZZmwJJVsHuBtYxzMO9YXvsXXDkmUJI6ASamurx1QR8rq5SfWSPod8dJkLi/2011-05-24%20Source%20Attribute%20Properties%20Before.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="86px" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1p4HaVMofyres0xl5Ysq1mHdJ40NZ68i_zOJCfJEZZmwJJVsHuBtYxzMO9YXvsXXDkmUJI6ASamurx1QR8rq5SfWSPod8dJkLi/2011-05-24%20Source%20Attribute%20Properties%20Before.jpg?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;Select the KeyColumn property, and click the ellipsis button (...) to open the Key Column selection dialog.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pS7wfBOXkwETtXYriNwECXNyR50fEfqIGQXlms7i292xwqKb6rAwoNlWCEFu_B4BjM1OYY7AyXMO-u7Zy5x7bdr1zOzp7awSN/2011-05-24%20Source%20Attribute%20KeyColumn%20Selection.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232px" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1pS7wfBOXkwETtXYriNwECXNyR50fEfqIGQXlms7i292xwqKb6rAwoNlWCEFu_B4BjM1OYY7AyXMO-u7Zy5x7bdr1zOzp7awSN/2011-05-24%20Source%20Attribute%20KeyColumn%20Selection.jpg?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;Pick another column that together with the Source Attribute will uniquely identify&amp;nbsp;a&amp;nbsp;Reference Attribute.&amp;nbsp; I've chosen to select&amp;nbsp;the Reference Attribute&amp;nbsp;column itself.&amp;nbsp; You may choose to select another column or columns that will uniquely identify the&amp;nbsp;Reference Attribute.&lt;br /&gt;
Since we've just&amp;nbsp;identified two columns to be the key for this attribute, SSAS can't use the default "name" for attribute members (the KeyColumn itself).&amp;nbsp; It doesn't know how to display specific members of this attribute - you've got to tell it by editing the NameColumn property - just under the KeyColumns property we just changed.&amp;nbsp; You may decide to simply choose the Source Attribute column (as I did).&lt;br /&gt;
The dimension will now successfully process... unless you've got another "duplicate attribute"!&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Success! Let's Recap&lt;/span&gt;&lt;br /&gt;
The short version of what we just did was:&lt;br /&gt;
We&amp;nbsp;deconstructed the error message to identify the Source Attribute&lt;br /&gt;
We examined the Attribute Relationship tab of the dimension to identify the Reference Attribute&lt;br /&gt;
We verified that there was a many-to-one relationship between the Source and Reference Attribute&lt;br /&gt;
We made the Source Attribute map one-to-one to the Reference Attribute by including the reference column in the KeyColumns for the Source Attribute.&lt;br /&gt;
What I don't know is whether this is the "best" general advice to give, or if there's a better rule of thumb for resolving this issue.&amp;nbsp; Until I do know, I'll be referring back to this step-by-step quite often, I'm sure...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-3465684168876763830?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=M_-8wCoKivk:zl6Ym1OTnK4:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=M_-8wCoKivk:zl6Ym1OTnK4:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=M_-8wCoKivk:zl6Ym1OTnK4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=M_-8wCoKivk:zl6Ym1OTnK4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=M_-8wCoKivk:zl6Ym1OTnK4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=M_-8wCoKivk:zl6Ym1OTnK4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/M_-8wCoKivk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/3465684168876763830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=3465684168876763830" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3465684168876763830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3465684168876763830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/M_-8wCoKivk/idiots-guide-to-ssas-attribute.html" title="Idiot's Guide to SSAS Attribute Relationships" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/idiots-guide-to-ssas-attribute.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QGQXg_eyp7ImA9WhZWF08.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-3556656673261049991</id><published>2011-05-18T05:22:00.000-07:00</published><updated>2011-05-18T05:22:00.643-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-18T05:22:00.643-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>How To: Use the Same Data Flow Column Twice As a Parameter in SSIS</title><content type="html">Every once in a while, you'll have a slightly more complex UPDATE statement in an OLE DB Command or Destination.&amp;nbsp; You'll use&amp;nbsp;an UPDATE&amp;nbsp;statement or a destination table&amp;nbsp;that needsto use data from&amp;nbsp;one column&amp;nbsp;in your data flow several times.&amp;nbsp; A typical example is a range update:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;UPDATE &lt;/span&gt;&lt;span style="color: black;"&gt;table1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SET &lt;/span&gt;&lt;span style="color: black;"&gt;column1 &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;WHERE &lt;/span&gt;&lt;span style="color: black;"&gt;datecolumn1&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt; &amp;lt;= &lt;span style="color: black;"&gt;?&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;AND &lt;/span&gt;&lt;span style="color: black;"&gt;datecolumn1&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt; &amp;gt; &lt;span style="color: black;"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
Yes, best practices say that you should probably avoid using the OLE DB Command entirely, but if you aren't updating many records and you don't mind the poor interface, it does get the job done.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What You Can't Do&lt;/span&gt;&lt;br /&gt;
The OLE DB Command interface asks for the statement (like above) that has question marks as placeholders for the values you're going to pass in.&amp;nbsp; The OLE DB and ADO.Net Destinations allow you to identify tables, or craft a SELECT statement to identify a table.&amp;nbsp;&amp;nbsp;They also have a interface for associating those numbered parameters or destination columns to the columns you have available in the data flow.&amp;nbsp; One of the many faults of this interface is that it doesn't permit two parameters/destination columns&amp;nbsp;to be associated with one column in the data flow - you just can't do it.&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/stirwise/1399341947/" imageanchor="1" style="clear: left; cssfloat: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1pt-FzqGTrvGFyRIp_lb_T92cCZ3cpdDpo1BDQIYFqCjnKFDYwHAThwJCQOw5eg4LyLsinWTteMC5lLCPUTdbDQYDbjP4FS_St/2011-05-18%20Another%20Splice%20Wont%20Hurt.jpg?psid=1" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Another Splice Won't Hurt...&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;﻿&lt;span style="color: #e69138; font-size: large;"&gt;What You Can Do&lt;/span&gt; ﻿﻿So if the interface only allows 1:1 associations of parameters in your statement to columns in the data flow... then you just need to duplicate a column in the data flow.&amp;nbsp; Add a Copy Column transform, or a Derived Column transform to the design surface just prior to the OLE DB Command or Destination transform to create a second column that contains the same data.&amp;nbsp; Now you've got what you need to configure your OLE DB Command or Destination properly. &lt;br /&gt;
&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-3556656673261049991?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cVaIVH_b2lk:n634qqfnaww:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=cVaIVH_b2lk:n634qqfnaww:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cVaIVH_b2lk:n634qqfnaww:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cVaIVH_b2lk:n634qqfnaww:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cVaIVH_b2lk:n634qqfnaww:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=cVaIVH_b2lk:n634qqfnaww:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/cVaIVH_b2lk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/3556656673261049991/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=3556656673261049991" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3556656673261049991?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3556656673261049991?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/cVaIVH_b2lk/how-to-use-same-data-flow-column-twice.html" title="How To: Use the Same Data Flow Column Twice As a Parameter in SSIS" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/how-to-use-same-data-flow-column-twice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8AQX4ycCp7ImA9WhZWEE4.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-5172403799850247249</id><published>2011-05-10T05:34:00.000-07:00</published><updated>2011-05-10T05:34:00.098-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-10T05:34:00.098-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Runtime Interaction with SSIS Packages - Confirming Actions</title><content type="html">In developing my data warehouse ETL processes, there are some packages and SQL Agent jobs that are both necessary to the process of deploying a new version of the ETL system - and yet are extremely dangerous.&amp;nbsp; These packages "reset" certain control&amp;nbsp;infomation to a known state, which is a destructive operation I want to make sure I think about twice before executing - especially in a QA or production environment.&amp;nbsp; If I executed this kind of package in development on my local machine, I&amp;nbsp;could use Script Tasks to pop up MessageBoxes to ask for this kind of confirmation.﻿ &lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pWdk95J2EbBCjueBTULwPi_rJJaqJS_1--jmcRx1oW4NizpnhiA_SvhUeaXO8ygTK6jzLKJCcpL2s01g9rythX4jNn_WKkNC8/2011-05-10%20Are%20You%20Sure.jpg?psid=1" imageanchor="1" style="clear: right; cssfloat: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" j8="true" src="http://7y0rtw.blu.livefilestore.com/y1pWdk95J2EbBCjueBTULwPi_rJJaqJS_1--jmcRx1oW4NizpnhiA_SvhUeaXO8ygTK6jzLKJCcpL2s01g9rythX4jNn_WKkNC8/2011-05-10%20Are%20You%20Sure.jpg?psid=1" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Are You Sure?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Of course, you can't do that when you're executing packages on a server!&amp;nbsp; There are also use cases beyond initial data loads.&amp;nbsp; You may allow your&amp;nbsp;SSIS packages to be callable by a wide range of people or systems... but you may want some oversight or confirmation before those packages are actually run.&amp;nbsp; Here's one way to balance convenience of access and execution with some protection against unintended execution.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Design&lt;/span&gt;&lt;br /&gt;
My basic thought process in finding an alternative to "confirmation" message boxes was:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I can't have a popup... how else can the server talk to me?&lt;/li&gt;
&lt;li&gt;Ah - it can send me an email.&amp;nbsp; Bonus - it doesn't matter who kicks off the job, I can hardcode an email address in there so I get the message, or&amp;nbsp;I can look up an email in a "responsibility" table so the email gets sent to a&amp;nbsp;designated "process owner."&lt;/li&gt;
&lt;li&gt;Now how do I talk back to the server?&amp;nbsp; I can't reply to the email - it doesn't have a mailbox.&lt;/li&gt;
&lt;li&gt;Ah - it can watch a share for a file to appear that contains a confirmation to continue.&lt;/li&gt;
&lt;li&gt;So how do I make sure that I don't confuse the package,&amp;nbsp;inadvertently acknowledging&amp;nbsp;confirmation for "request #2" when I intended to&amp;nbsp;confirm "request #1"?&amp;nbsp; You know how that happens every once in a while - you're editing a document, and some other program "pops up" to ask you a question... but you don't stop typing in time, and your keystrokes end up selecting something and dismissing the dialog!&lt;/li&gt;
&lt;li&gt;Ah&amp;nbsp;- I can require the file contents to be something... special... and unique to that package execution.&amp;nbsp; Some kind of code that would be unlikely to&amp;nbsp;mistype unless I spent some serious brain power on it.&amp;nbsp; Like a GUID.&lt;/li&gt;
&lt;li&gt;But I don't want to have to navigate to the share, create a new text file, and hand-transcribe a GUID.&amp;nbsp; I'll probably type it in wrong and have to restart the process again.&amp;nbsp; (Faulty humans!)&lt;/li&gt;
&lt;li&gt;Ah - I can attach the file to the email, so all I have to do is save it in the required location.&lt;/li&gt;
&lt;/ul&gt;Yeah - OK already.&amp;nbsp; So it takes me a while to figure this stuff out...&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Implementation&lt;/span&gt;&lt;br /&gt;
I'd put up a sample package -&amp;nbsp;but I'm too &lt;strike&gt;lazy&lt;/strike&gt; &lt;em&gt;busy&lt;/em&gt; to strip out the sensitive and custom stuff from one of my packages, so I'll just describe it.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 1: Add a Share&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Find&amp;nbsp;a location on your&amp;nbsp;network and create a share that you give permission to both you (as the package execution confirmer) as well as the account you're going to be executing the SSIS package under.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 2: Script - Generate the Confirmation File Contents&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Add an SSIS variable called "Confirmation File Name" that contains the UNC path (not driver letter path) to where you want the confirmation file placed.&lt;br /&gt;
Pass that variable into the Script Task, along with the MachineName and ExecutionInstanceGUID system variables.&amp;nbsp; I've chosen the ExecutionInstanceGUID as my "confirmation code" - you can choose something else entirely: a passphrase, or another GUID generated by &lt;a href="http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx"&gt;Guid.NewGuid&lt;/a&gt;.&amp;nbsp; (It's more secure if you generate another GUID rather than use the execution instance - someone could guess your implementation and subvert the email step if they have access to the sysssislog table.)&lt;br /&gt;
Paste in code somewhat like this:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;
System.IO.StreamWriter confirmationFile &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Variables["User::ConfirmationFilePathname"].Value&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;confirmationFile.WriteLine&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: grey;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Variables["System::ExecutionInstanceGUID"].Value&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;confirmationFile.Close&lt;/span&gt;&lt;span style="color: grey;"&gt;();&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;Dts.TaskResult &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;ScriptResults.Success&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;System.IO.File.CreateText&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
As you'll see in a bit, I've built the file in the exact spot that I intend to look for it... we'll take care of that.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 3: Send the Confirmation&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Slap a Send Mail Task down, set it up to send you an email, and attach the file using the ConfirmationFilePathname variable.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 4: Delete the Confirmation File&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
As&amp;nbsp;you pointed out earlier, if I "waited" for you to place that file in the location we want, it wouldn't work - because the file is already there!&amp;nbsp; So I need to delete it, making sure that I've got a clean spot for you to place &lt;em&gt;your&lt;/em&gt; confirmation.&lt;br /&gt;
(You could have created the file in a separate location so this isn't an issue - but deleting it was simpler to set up.)&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 5: Wait... and Watch&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
You can use a Script to do this entirely - I happen to have used my &lt;a href="http://filepropertiestask.codeplex.com/"&gt;File Properties Task&lt;/a&gt; instead.&amp;nbsp; It's up to you, but in this step, you'll be waiting for the file to reappear.&amp;nbsp; How long you wait, and how often you check is also up to you - but I suggest you don't wait indefinitely.&amp;nbsp; Have your package fail if a certain timeout is reached.&amp;nbsp; If you use a Script to watch for the file, you'll be using &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx"&gt;System.IO.File.Exists&lt;/a&gt;&amp;nbsp;and &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep.aspx"&gt;System.Threading.Thread.Sleep&lt;/a&gt;&amp;nbsp;to do that.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 6: Read the File&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
If you receive your email, decide to confirm the action, and save it to the right share, your package will arrive at this step.&amp;nbsp; It's now got to open the file and check the contents with another Script Task to make sure you're responding to the proper request.&amp;nbsp; Here's one with an appropriate level of error handling:&lt;br /&gt;
&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain &lt;/span&gt;&lt;span style="color: blue;"&gt;= true&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;string &lt;/span&gt;&lt;span style="color: black;"&gt;confirmationFileName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Variables["User::ConfirmationFilePathname"].Value&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;Dts.TaskResult &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;ScriptResults.Failure&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;string &lt;/span&gt;&lt;span style="color: black;"&gt;contents &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;System.IO.StreamReader confirmationFile; &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&amp;nbsp; confirmationFile &lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;System.IO.File.OpenText&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;confirmationFileName&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Events.FireInformation&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Confirmation file opened."&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;contents &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;confirmationFile.ReadLine&lt;/span&gt;&lt;span style="color: grey;"&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Events.FireInformation&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Confirmation file contents read."&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;confirmationFile.Close&lt;/span&gt;&lt;span style="color: grey;"&gt;();&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;catch &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Exception ex&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Dts.Events.FireError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Unable to open '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;confirmationFileName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' to "&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"check contents: " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: blue;"&gt;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;contents &lt;/span&gt;&lt;span style="color: blue;"&gt;== &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.Variables["System::ExecutionInstanceGUID"].Value&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Dts.Events.FireInformation&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Confirmation file contents validated."&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Dts.TaskResult &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;ScriptResults.Success&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Dts.Events.FireError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: grey;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Confirmation file contents failed to "&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: darkred;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;+ &lt;/span&gt;"match expected code."&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
If the confirmation file contains the right code, it will return success, otherwise it will fail with an appropriate message.&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Task 7+: Do Your Dirty Work&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Your package just got the green light to trash the place (or do whatever critical action was requested)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-5172403799850247249?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=44Z3qE3xc8s:TaqWx8wWonQ:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=44Z3qE3xc8s:TaqWx8wWonQ:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=44Z3qE3xc8s:TaqWx8wWonQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=44Z3qE3xc8s:TaqWx8wWonQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=44Z3qE3xc8s:TaqWx8wWonQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=44Z3qE3xc8s:TaqWx8wWonQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/44Z3qE3xc8s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/5172403799850247249/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=5172403799850247249" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/5172403799850247249?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/5172403799850247249?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/44Z3qE3xc8s/runtime-interaction-with-ssis-packages.html" title="Runtime Interaction with SSIS Packages - Confirming Actions" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/runtime-interaction-with-ssis-packages.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFSXY7fSp7ImA9WhZXFEg.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4472809950579353964</id><published>2011-05-03T05:15:00.000-07:00</published><updated>2011-05-03T13:45:18.805-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T13:45:18.805-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Data Flow" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Iterating Over Columns in the SSIS Script Component</title><content type="html">Just recently a &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/82639c70-1954-4c15-9f6e-2ece1c69ef78"&gt;question was posed&lt;/a&gt; in the MSDN SSIS Forums about how to create a "generic" script component that would read all columns for each row passed through it in the Data Flow.&amp;nbsp; The standard&amp;nbsp;impetus for this kind of behaviour is a logging or auditing step in the Data Flow.&amp;nbsp; Now - my first reaction is that you should probably be looking to code a custom component so that you aren't copying and pasting script code everywhere... &lt;br /&gt;
But I know that not everyone is comfortable coding a custom component from scratch - you have to be a code addict like me to find joy in that.&amp;nbsp; So here's a little "gateway drug" for those of you who are itching for the capability.&amp;nbsp; Perhaps a little taste of it will expose you to the script's shortcomings, and lead you to build your own lab to cook up a custom component to do this job properly.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Location, Location, Location&lt;/span&gt;&lt;br /&gt;
The big key here, as &lt;a href="http://social.msdn.microsoft.com/forums/en-US/sqlintegrationservices/thread/a8ce2c35-af23-4dbd-919e-fbdef8534902/"&gt;mentioned by Darren Green&lt;/a&gt; in an earlier post on the subject, is where to put code to do this.&amp;nbsp; It's not in one of the automatically generated stubs - you'll have to tread into slightly less familiar territory - the ProcessInput method override.&amp;nbsp; The standard stubs (PreExecute, PostExecute, and Input0_ProcessInputRow) are all useless for our purposes - you can safely delete them or ignore them.&amp;nbsp; Why?&amp;nbsp; PreExecute doesn't yet have any information about the buffer, and PostExecute is too late (obviously).&amp;nbsp; Input0_ProcessInputRow is called once per row... but with a carefully wrapped row object that presents the columns in nicely named properties.&amp;nbsp; There's no way to access the collection of columns.&amp;nbsp; Only ProcessInput has access to the buffer in a condition that allows iterating over the columns.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Paste This Code&lt;/span&gt;&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;public override void &lt;/span&gt;&lt;span style="color: black;"&gt;ProcessInput&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;int &lt;/span&gt;&lt;span style="color: black;"&gt;InputID&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;PipelineBuffer Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain &lt;/span&gt;&lt;span style="color: blue;"&gt;= true&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;ComponentMetaData.FireInformation&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.ColumnCount.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" columns"&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;while &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.NextRow&lt;/span&gt;&lt;span style="color: grey;"&gt;())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;for &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;int &lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.ColumnCount&lt;/span&gt;&lt;span style="color: grey;"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex&lt;/span&gt;&lt;span style="color: grey;"&gt;++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;string &lt;/span&gt;&lt;span style="color: black;"&gt;columnData &lt;/span&gt;&lt;span style="color: blue;"&gt;= null&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.IsNull&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex&lt;/span&gt;&lt;span style="color: grey;"&gt;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columnData &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"is NULL"&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferColumn columnInfo &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.GetColumnInfo&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;switch &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;columnInfo.DataType&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;case &lt;/span&gt;&lt;span style="color: black;"&gt;DataType.DT_BOOL:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columnData &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.GetBoolean&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;case &lt;/span&gt;&lt;span style="color: black;"&gt;DataType.DT_WSTR:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columnData &lt;/span&gt;&lt;span style="color: grey;"&gt;+&lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer.GetString&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;// add code to support more data types here&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columnData &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Column " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;columnIndex.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;": " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;columnData&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;0&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;fireAgain&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;base.ProcessInput&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;InputID&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's Happening In There?&lt;/span&gt;&lt;br /&gt;
It doesn't take much explanation - but every little bit helps.&amp;nbsp; &lt;br /&gt;
Initially, a loop has to be constructed to iterate over all the rows we're given.&amp;nbsp; Do remember that this isn't ALL the rows coming through your Data Flow - it's just one buffer's worth.&amp;nbsp; This method will get called several times (unless you have very few rows in your flow).&lt;br /&gt;
The column then gets checked to see if it's NULL... because NULLs cause quite a problem when you don't expect to see them.&lt;br /&gt;
After that, a little inquiry is made to ask for some information about the column.&amp;nbsp; This bit of code can definitely be optimized out of the loop - it is a burden on the system to ask for it for each and every row!&lt;br /&gt;
The reason for getting a little information about the column is apparent in the next block - the switch statement that handles different datatypes differently.&amp;nbsp; You can extend the code to handle the data types you expect.&lt;br /&gt;
Finally, after the loop, don't forget to call the base ProcessInput method.&amp;nbsp; Why?&amp;nbsp; Press F12 on that call and you'll see - the base code handles marking the processing as being complete when you've finished seeing all the rows.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Variations On This Theme&lt;/span&gt;&lt;br /&gt;
The above code isn't the only way to get this done.&amp;nbsp; You can do away with manually detecting the column data type and simply call ToString on the buffer's indexer - as in:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;string&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;columnData &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Buffer[columnIndex].ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;();&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
But do still beware of nulls and other odd results.&amp;nbsp; Using the "Get" methods specific to the data type do perform faster, and are safer in the long run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-4472809950579353964?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=4KufpC-IpRM:Fjhk6guQbDA:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=4KufpC-IpRM:Fjhk6guQbDA:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=4KufpC-IpRM:Fjhk6guQbDA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=4KufpC-IpRM:Fjhk6guQbDA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=4KufpC-IpRM:Fjhk6guQbDA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=4KufpC-IpRM:Fjhk6guQbDA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/4KufpC-IpRM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4472809950579353964/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=4472809950579353964" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4472809950579353964?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4472809950579353964?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/4KufpC-IpRM/iterating-over-columns-in-ssis-script.html" title="Iterating Over Columns in the SSIS Script Component" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/iterating-over-columns-in-ssis-script.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGRXczfCp7ImA9WhZQGEg.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-1040050963179896228</id><published>2011-04-26T16:15:00.000-07:00</published><updated>2011-04-26T16:15:24.984-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-26T16:15:24.984-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Extract Transform Load (ETL)" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Transforming SSIS' sysssislog Entries Into Something More Readable</title><content type="html">The format of sysssislog in SSIS 2005 and 2008 isn't great for human consumption, so what follows is an attempt to reformat it for easier digestion.&amp;nbsp; It isn't perfect - and here's hoping that the new Denali (the next version of SQL Server) server-side toolset will improve the situation&amp;nbsp;it as much as I think it will.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Raw sysssislog Table Listing&lt;/span&gt;&lt;br /&gt;
My difficulty is with the nature of the logging - it "bubbles up" the same message to each containing task. The result is that the same message is reported multiple times in the log, which doesn't make it very concise (for reading). There's no doubt that it does make it easier to see everything that happened to or within a specific task - but that's not typically how I read the logs.&amp;nbsp; Issuing a simple query such as:&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt; &lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;sysssislog &lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;/code&gt; &lt;br /&gt;
Results in a rowset like this (click to enlarge):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pkIFwv9AO-Ek5lyrUmVUYrbM2U9k0fCecexgoZcmKP0P9JDchWxByuhaqtgW0IMKfaSHZYQ25AU1uG4UbS9XpgwTv9ZT1BAlT/2011-04-26%20Raw%20Query.png?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="112px" i8="true" src="http://7y0rtw.blu.livefilestore.com/y1pkIFwv9AO-Ek5lyrUmVUYrbM2U9k0fCecexgoZcmKP0P9JDchWxByuhaqtgW0IMKfaSHZYQ25AU1uG4UbS9XpgwTv9ZT1BAlT/2011-04-26%20Raw%20Query.png?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;My difficulty with the above is that (in this case) there are&amp;nbsp;two rows per "message" - and that's just a simple demo&amp;nbsp;package.&amp;nbsp; More typically, I've got five or more nested containers, resulting in a lot of repetition.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Distilled Query&lt;/span&gt;&lt;br /&gt;
My desire was to distill the log records such that there was only one row per "message" instead of several.&amp;nbsp; You can't simply group by the message, of course. You have to&amp;nbsp;group only adjacent entries and also (preferably) still show the involvement of each level of the Task hierarchy, because&amp;nbsp;that context information is still valuable.&lt;br /&gt;
What I've arrived at is the following, which will distill the last 1000&amp;nbsp;entries in the log into something less wordy.&amp;nbsp; It's still not ideal - tasks executing in parallel get mashed together.&amp;nbsp; Those of you who are experts in T-SQL and windowing functions will no doubt be able to optimize this.&amp;nbsp; Please post&amp;nbsp;a comment&amp;nbsp;if you do!&lt;br /&gt;
&lt;code style="font-size: 12px;"&gt;&lt;span style="color: blue;"&gt;WITH &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;LOG_SUBSET &lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT TOP &lt;/span&gt;&lt;span style="color: black;"&gt;1000 id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: magenta;"&gt;REPLACE&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: red;"&gt;'User:'&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: red;"&gt;''&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;sysssislog&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id &lt;/span&gt;&lt;span style="color: blue;"&gt;DESC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;ORDERED_LOG_SUBSET &lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT TOP &lt;/span&gt;&lt;span style="color: black;"&gt;1000 id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span stule="color:black"&gt;message&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;LOG_SUBSET&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;EVENTTYPED_LOG &lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;HASHBYTES&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;'SHA1'&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: magenta;"&gt;CAST&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;starttime &lt;/span&gt;&lt;span style="color: blue;"&gt;AS CHAR&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;20&lt;/span&gt;&lt;span style="color: grey;"&gt;)) + &lt;/span&gt;&lt;span style="color: black;"&gt;event &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;ORDERED_LOG_SUBSET&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;CONTIGUOUS_EVENT_GROUPED_LOG &lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: grey;"&gt;() &lt;/span&gt;&lt;span style="color: blue;"&gt;OVER &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;s1&lt;/span&gt;&lt;span style="color: grey;"&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: grey;"&gt;() &lt;/span&gt;&lt;span style="color: blue;"&gt;OVER &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;PARTITION &lt;/span&gt;&lt;span style="color: blue;"&gt;BY &lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key &lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;s2&lt;/span&gt;&lt;span style="color: grey;"&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: grey;"&gt;() &lt;/span&gt;&lt;span style="color: blue;"&gt;OVER &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) - &lt;/span&gt;&lt;span style="color: black;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: grey;"&gt;() &lt;/span&gt;&lt;span style="color: blue;"&gt;OVER &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;PARTITION &lt;/span&gt;&lt;span style="color: blue;"&gt;BY &lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key &lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;sequence&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;EVENTTYPED_LOG&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;GROUPED_LOG &lt;/span&gt;&lt;span style="color: blue;"&gt;AS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;s1&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;s2&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;sequence&lt;/span&gt;&lt;span style="color: grey;"&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;HASHBYTES&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;'SHA1'&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: magenta;"&gt;CAST&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;eventtype_group_key &lt;/span&gt;&lt;span style="color: blue;"&gt;AS CHAR&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;36&lt;/span&gt;&lt;span style="color: grey;"&gt;)) + &lt;/span&gt;&lt;span style="color: magenta;"&gt;CAST&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;sequence &lt;/span&gt;&lt;span style="color: blue;"&gt;AS CHAR&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;10&lt;/span&gt;&lt;span style="color: grey;"&gt;))) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;event_group&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;CONTIGUOUS_EVENT_GROUPED_LOG&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: magenta;"&gt;MIN&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta;"&gt;SUBSTRING&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: magenta;"&gt;REPLACE&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: magenta;"&gt;REPLACE&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color: red;"&gt;' &amp;lt; ' &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;GROUPED_LOG &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;Y&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;WHERE &lt;/span&gt;&lt;span style="color: black;"&gt;X.event_group &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Y.event_group&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;GROUP BY &lt;/span&gt;&lt;span style="color: black;"&gt;source&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: magenta;"&gt;MIN&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;DESC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FOR XML &lt;/span&gt;&lt;span style="color: black;"&gt;PATH&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;''&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;), &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;'&amp;amp;lt;'&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: red;"&gt;'&amp;lt;'&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: red;"&gt;'&amp;amp;amp;'&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: red;"&gt;'&amp;amp;'&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;3&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;2000&lt;/span&gt;&lt;span style="color: grey;"&gt;) &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;source_list&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;FROM &lt;/span&gt;&lt;span style="color: black;"&gt;GROUPED_LOG &lt;/span&gt;&lt;span style="color: blue;"&gt;AS &lt;/span&gt;&lt;span style="color: black;"&gt;X&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;GROUP BY &lt;/span&gt;&lt;span style="color: black;"&gt;event&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;starttime&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;event_group&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color: magenta;"&gt;MIN&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
A sample of the resulting rowset (click to enlarge):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pkIFwv9AO-EnuVCa90_UKdPhf5E6IctjbweWfrE1kuvwgsRvEW2cPJRfyleWLYvWS6Icsx-bO6dzlOOrWNluEtA4ZbU6Wrn6F/2011-04-26%20Distilled%20Query.png?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60px" i8="true" src="http://7y0rtw.blu.livefilestore.com/y1pkIFwv9AO-EnuVCa90_UKdPhf5E6IctjbweWfrE1kuvwgsRvEW2cPJRfyleWLYvWS6Icsx-bO6dzlOOrWNluEtA4ZbU6Wrn6F/2011-04-26%20Distilled%20Query.png?psid=1" width="320px" /&gt;&lt;/a&gt;&lt;/div&gt;It's not fantastic, but it does improve my diagnostic tracing a little bit.&lt;br /&gt;
Thanks to information from &lt;a href="http://boneist-oracle.livejournal.com/7389.html"&gt;Boneist&lt;/a&gt; and &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/f5ca1754-38f8-4a1f-9440-ab140c95c57a"&gt;Tom Cooper&lt;/a&gt;&amp;nbsp;on grouping, and &lt;a href="http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/"&gt;Anith Sen&lt;/a&gt;&amp;nbsp;on pivoting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-1040050963179896228?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Dmv3SLX_whI:qeswtsQ2E-Y:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Dmv3SLX_whI:qeswtsQ2E-Y:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Dmv3SLX_whI:qeswtsQ2E-Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Dmv3SLX_whI:qeswtsQ2E-Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Dmv3SLX_whI:qeswtsQ2E-Y:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Dmv3SLX_whI:qeswtsQ2E-Y:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/Dmv3SLX_whI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/1040050963179896228/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=1040050963179896228" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1040050963179896228?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1040050963179896228?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/Dmv3SLX_whI/transforming-ssis-sysssislog-entries.html" title="Transforming SSIS' sysssislog Entries Into Something More Readable" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/04/transforming-ssis-sysssislog-entries.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EARX45fip7ImA9WhZSFE8.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-6249091462260321932</id><published>2011-03-14T06:27:00.000-07:00</published><updated>2011-03-29T13:14:04.026-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-29T13:14:04.026-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Dimension Merge SCD" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>More Changes for the Dimension Merge SCD?</title><content type="html">A while back,&amp;nbsp;I &lt;a href="http://toddmcdermid.blogspot.com/2011/02/changes-to-ssis-slowly-changing.html"&gt;ran a contest to find a new name&lt;/a&gt; for the SCD component hosted on CodePlex.&amp;nbsp; The results were the best "lemons into lemonade" situation I could have expected.&amp;nbsp; Now I've got some other news I can share that should extend the reach and capabilities of every Data Warehouse ETL developer that uses Integration Services.&amp;nbsp; &lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;This Time, No Lemons... Porkbellies Instead&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pTM8TBjCKtdQFiObwpx9VE7zEs6KKgdJAzKLIOYL1xFNjHRkSIyX3E_ywGcIvi-wCSWPtWan3xTDnNRsSGm18cYaP2Gufj-we/flickr-tokyofoodcast-64462930.jpg?psid=1" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" l6="true" src="http://7y0rtw.blu.livefilestore.com/y1pTM8TBjCKtdQFiObwpx9VE7zEs6KKgdJAzKLIOYL1xFNjHRkSIyX3E_ywGcIvi-wCSWPtWan3xTDnNRsSGm18cYaP2Gufj-we/flickr-tokyofoodcast-64462930.jpg?psid=1" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;One of the problems I'd always had with offering a component on CodePlex was that it meant some enthusiastic would-be users couldn't end up using it in their production environments.&amp;nbsp; The reasons they were unable to use the component weren't technical, they were business-related:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Open-source project software was avoided due to (valid) longevity concerns.&lt;/li&gt;
&lt;li&gt;In-house development capabilities weren't sufficient to provide support, should a problem occur.&lt;/li&gt;
&lt;li&gt;"Untrusted" vendor code wasn't permitted on production servers.&lt;/li&gt;
&lt;/ul&gt;The "easy" solution?&amp;nbsp; Offer support for the component myself, building up that trust level and support network.&amp;nbsp; But I've got a very nice day job, thank you, and not nearly enough free time - not "easy" for me, I'm afraid.&amp;nbsp;&amp;nbsp;The bottom line is that offering support myself&amp;nbsp;doesn't make sense for me, or a good business proposition for those potential users.&amp;nbsp; I just don't have the economies of scale to work with, or the track record.&lt;br /&gt;
So if I can't do it, who can turn those porkbellies into tasty bacon?&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Heat Up the Frying Pan&lt;/span&gt;&lt;br /&gt;
One of the component's ardent enthusiasts for a few years now has been&amp;nbsp;Joe Salvatore.&amp;nbsp; He's helped with testing and has provided feedback on improvements for several releases.&amp;nbsp; Just recently, he started with a new consulting company, and apparently the guy is pretty vocal.&amp;nbsp; ;)&amp;nbsp; I don't know the whole story, but I can imagine Joe did&amp;nbsp;a demonstration or two, some quick talking, and twisted someone's arm.&amp;nbsp; Questionable karaoke footage could have factored into the equation as well.&lt;br /&gt;
So who's&amp;nbsp;attention did Joe attract that could smoke and cure a little raw porkbelly into something you can actually sink your teeth into?&amp;nbsp; Brian Knight and his crew at Pragmatic Works, that's who.&amp;nbsp; This is the Brian Knight that's written &lt;a href="http://www.amazon.com/gp/search/ref=sr_tc_2_0?rh=i%3Astripbooks%2Ck%3ABrian+Knight&amp;amp;keywords=Brian+Knight&amp;amp;ie=UTF8&amp;amp;qid=1298676457&amp;amp;sr=8-2-ent&amp;amp;field-contributor_id=B001IYV61O"&gt;quite a few books&lt;/a&gt;, has a &lt;a href="http://www.pragmaticworks.com/"&gt;successful consulting company&lt;/a&gt;, has contributed voluminous amounts of time to the community by &lt;a href="http://www.sqlpass.org/AboutPASS/BoardofDirectors.aspx"&gt;serving on the PASS board&lt;/a&gt;,&amp;nbsp;co-founding &lt;a href="http://www.sqlsaturday.com/"&gt;SQL Saturdays&lt;/a&gt;&amp;nbsp;and &lt;a href="http://sqlservercentral.com/"&gt;SQLServerCentral.com&lt;/a&gt;.&amp;nbsp;&amp;nbsp;You know Brian's all about the bacon for the SQL community.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Soft or Crispy?&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pl73p1Io-PwrjMkNqe8kwRvHycM2nlipDF3N3sqeOFCvy-KLLqmPVX5LfEKzu7F1nUOHWXe2QnTwunELS9O5SOyu2eu_tblz6/flickr-not_on_display-4430743342.jpg?psid=1" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="149" l6="true" src="http://7y0rtw.blu.livefilestore.com/y1pl73p1Io-PwrjMkNqe8kwRvHycM2nlipDF3N3sqeOFCvy-KLLqmPVX5LfEKzu7F1nUOHWXe2QnTwunELS9O5SOyu2eu_tblz6/flickr-not_on_display-4430743342.jpg?psid=1" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;If you're looking for a dimension table loading experience in Integration Services that's fast, flexible, and maintainable, you can't look to in-the-box Microsoft tools today.&amp;nbsp; They're continuing to stand pat with what they have in that department - arguably a very servicable tool in the SCD Wizard.&amp;nbsp; But if that's not good enough for you, and you're not&amp;nbsp;keen&amp;nbsp;on re-inventing the wheel, you now have very viable choices.&amp;nbsp; How do you like your 3rd party components?&amp;nbsp; Open-source or commercial?&amp;nbsp; Community forums&amp;nbsp;or paid support?&amp;nbsp; This partnership gets you what you need, the way you want it.&lt;br /&gt;
Pragmatic Works is working on improving the&amp;nbsp;component in ways that work for them and their customers; they'll be including it in their &lt;a href="http://pragmaticworks.com/Products/Business-Intelligence/TaskFactory/Features.aspx"&gt;Task Factory&lt;/a&gt; set of tools.&amp;nbsp; That's a great option for the more "conservative" organizations out there.&amp;nbsp; But if that's not you, you're not left out in the cold.&amp;nbsp; The free-to-use &lt;a href="http://scd.codeplex.com/"&gt;open-source project on CodePlex&lt;/a&gt; is independent, and will continue on its own - that's the beauty of open source and business working together.&amp;nbsp; Brian knows there's a real gap in the Dimension Merge SCD story today - the lack of vendor support.&amp;nbsp; Even if he didn't change a stitch of code,&amp;nbsp;providing that support&amp;nbsp;adds value&amp;nbsp;for his customers that they're willing to pay for.&amp;nbsp; There's no need for any kind of exclusivity in this arrangement - the value is self-evident.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Order Up!&lt;/span&gt;&lt;br /&gt;
I'd like to give a hearty thanks to Brian Knight and &lt;a href="http://pragmaticworks.com/company/staff/"&gt;everyone that works with him&lt;/a&gt;.&amp;nbsp; I'll be helping them out as much as I can to explain the spaghetti code they're trying to understand, but I'm confident they'll be providing a Dimension Merge&amp;nbsp;SCD that works even better and easier&amp;nbsp;than what I've made so far - and they'll stand behind it.&amp;nbsp; Brian didn't have to even talk to me to get this done - he could have freely downloaded the code and used it as he wished.&amp;nbsp; But he's a community-minded guy.&amp;nbsp; He reached out to me for my support and I really appreciate it.&amp;nbsp; Thanks, Brian!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-6249091462260321932?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IldtNkdpROk:MXJ6HR6dyTo:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=IldtNkdpROk:MXJ6HR6dyTo:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IldtNkdpROk:MXJ6HR6dyTo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IldtNkdpROk:MXJ6HR6dyTo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=IldtNkdpROk:MXJ6HR6dyTo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=IldtNkdpROk:MXJ6HR6dyTo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/IldtNkdpROk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/6249091462260321932/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=6249091462260321932" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6249091462260321932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6249091462260321932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/IldtNkdpROk/more-changes-for-dimension-merge-scd.html" title="More Changes for the Dimension Merge SCD?" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/03/more-changes-for-dimension-merge-scd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcEQXwzeCp7ImA9Wx9aFko.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-2578254812134370943</id><published>2011-03-09T05:40:00.000-08:00</published><updated>2011-03-09T05:40:00.280-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T05:40:00.280-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLSaturday" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="CodePlex" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Dimension Merge SCD" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Say Hi to the Dimension Merge SCD Component</title><content type="html">Last week was a great week all around.&amp;nbsp; It started with &lt;a href="http://www.sqlsaturday.com/65/eventhome.aspx"&gt;Canada's first SQL Saturday&lt;/a&gt; in Vancouver - packed with over 300 attendees watching five tracks of local speakers and MVP designated imports.&amp;nbsp; I had the privilege of hosting one of those rooms and watching Donabel Santos (&lt;a href="http://www.sqlmusings.com/"&gt;blog&lt;/a&gt;|&lt;a href="http://www.twitter.com/sqlbelle"&gt;twitter&lt;/a&gt;) elucidate on SSRS, John Welch (&lt;a href="http://agilebi.com/jwelch"&gt;blog&lt;/a&gt;|&lt;a href="http://www.twitter.com/john_welch"&gt;twitter&lt;/a&gt;) go 2-for-2 on exposing SSIS internals, and Bill Pearson (&lt;a href="http://www.databasejournal.com/article.php/1459531"&gt;blog&lt;/a&gt;) delivering an introduction to MDX in his fine southern accent.&amp;nbsp; I suggest you download their code and slides from the &lt;a href="http://www.sqlsaturday.com/65/schedule.aspx"&gt;SQL Saturday session list&lt;/a&gt;, or their blogs.&amp;nbsp; I've just uploaded my slide deck and demo package for the talk I did on &lt;a href="http://www.sqlsaturday.com/viewsession.aspx?sat=65&amp;amp;sessionid=3452"&gt;Data Warehouse ETL with SSIS&lt;/a&gt; - thanks again for all those that attended that last session of the day!&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;MVP Summit 2011&lt;/span&gt;&lt;br /&gt;
Of course, SQL Saturday #65 was scheduled on February 26th very deliberately - in order to benefit from proximity to the Microsoft MVP Summit being held the following week in Bellevue/Redmond.&amp;nbsp; A fantastic experience (again), and definitely one I hope to repeat many more times.&amp;nbsp; Not only was it an amazing opportunity to connect with the development crew of SQL Server Integration Services directly - it's also a spectacular opportunity to interact with the best of the best, the other MVPs.&amp;nbsp; After last week, I have a list as long as my arm of things to investigate - it's almost depressing to have a real job!&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Contest Results&lt;/span&gt;&lt;br /&gt;
But the real action last week was, of course - my &lt;a href="http://toddmcdermid.blogspot.com/2011/02/changes-to-ssis-slowly-changing.html"&gt;contest to find&amp;nbsp;a new name&lt;/a&gt; for the better-than-decent Slowly Changing Dimension component I've been &lt;a href="http://dimensionmergescd.codeplex.com/"&gt;hosting on CodePlex&lt;/a&gt; for the last few years.&amp;nbsp; I was absolutely blown away by the response - you could see the comments on the original post, but there was also quite a few submissions via twitter and email.&amp;nbsp; A huge thank-you has to go out to &lt;a href="http://sqlservercentral.com/"&gt;Steve Jones and the SQLServerCentral crew&lt;/a&gt; that highlighted the contest on their weekly newsletter to their million-plus membership.&amp;nbsp; There was a massive response from that exposure - nothing like I could have ever expected.&lt;br /&gt;
Down to brass tacks!&amp;nbsp; The title of this post told you the new name of the component: the "Dimension Merge SCD" - so congratulations go out to Merrill Aldritch (&lt;a href="http://www.onupdatecascade.com/"&gt;blog&lt;/a&gt;), a fellow SQL blogger.&amp;nbsp; There were some other names that I was really attracted to - it wasn't an easy call!&amp;nbsp; In the end, Merrill's was the most descriptive and fit in with what I was looking for.&amp;nbsp; So congratulations to Merrill - I'll be sending off a Windows 7 Pro to him, even though I promised an Ultimate.&amp;nbsp; Purchasing limits and prior commitments&amp;nbsp;conspired against&amp;nbsp;me on that - so I've also included a little something extra to make up for it.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;More To Come&lt;/span&gt;&lt;br /&gt;
Obviously, there's more in store for the Dimension Merge SCD - I have to release v1.6 into the wild, and those of you with a finger on the pulse of the community may have an inside track on another bit of news I'll be shouting from the rooftops in short order.&amp;nbsp; Stay tuned...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-2578254812134370943?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=2WKbQHB-R2g:-g-ou7Q4Urw:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=2WKbQHB-R2g:-g-ou7Q4Urw:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=2WKbQHB-R2g:-g-ou7Q4Urw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=2WKbQHB-R2g:-g-ou7Q4Urw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=2WKbQHB-R2g:-g-ou7Q4Urw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=2WKbQHB-R2g:-g-ou7Q4Urw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/2WKbQHB-R2g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/2578254812134370943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=2578254812134370943" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2578254812134370943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2578254812134370943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/2WKbQHB-R2g/say-hi-to-dimension-merge-scd-component.html" title="Say Hi to the Dimension Merge SCD Component" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/03/say-hi-to-dimension-merge-scd-component.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcDRXc-fSp7ImA9Wx9aF00.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-1807093634989755312</id><published>2011-02-25T05:35:00.000-08:00</published><updated>2011-03-09T14:01:14.955-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T14:01:14.955-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Dimension Merge SCD" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Changes to the SSIS Slowly Changing Dimension Component</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/alexlc13/3563736956/" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" l6="true" src="http://7y0rtw.blu.livefilestore.com/y1p1rNN4zE7ApxEwIl_urscPnMNLw0Z7rSt5xHt9vlbqZL_dw8TdUPXh94mi1EW4UXZ37OFSu3F3Bh4lv8vZKatnfPJ_TlL2TUM/2011-02-25%20Chameleon.jpg?psid=1" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;Probably &lt;em&gt;not&lt;/em&gt; the kind of change you're expecting.&amp;nbsp; I've recently been contacted by the &lt;a href="http://kimballgroup.com/"&gt;Kimball Group&lt;/a&gt;, and they've asked me to stop using the word "Kimball" to identify the component.&amp;nbsp; They have every right to make sure nobody is confused about who they are and what they do, or try to capitalize unfairly on their reputation.&amp;nbsp; I never intended to do anything of the sort, and certainly hope I've never given that impression.&amp;nbsp; Work is (slowly) underway to strip it out of the project materials on CodePlex.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Lemonade, Anyone?&lt;/span&gt;&lt;br /&gt;
So if I can't identify the component by the name of the methodology it follows... I've got to find something else for it's title - because "SCD component" is just boring, and will easily be confused by the &lt;a href="http://msdn.microsoft.com/en-us/library/ms141715.aspx"&gt;component of the same name&lt;/a&gt; (but definitely inferior capability IMO) included within SQL Server Integration Services.&lt;br /&gt;
I could come up with a label, but it would probably be &lt;em&gt;really&lt;/em&gt; lame.&amp;nbsp; Anything I can think&amp;nbsp;of to tack on to "SCD Component" seems trite and overused in the world of 3rd party objects.&amp;nbsp; Your typical adjectives of "ultimate", "fast", "improved", "enhanced" don't seem to be able to capture what I'm looking for.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;I Need Your Help&lt;/span&gt;&lt;br /&gt;
This component turned into a real community experience for me - &lt;a href="http://dimensionmergescd.codeplex.com/stats"&gt;50,000 site visits,13,000 downloads&lt;/a&gt;, &lt;a href="http://dimensionmergescd.codeplex.com/discussions"&gt;600 discussion posts&lt;/a&gt;, and &lt;a href="http://dimensionmergescd.codeplex.com/workitem/list/basic"&gt;100 bug reports and suggestions&lt;/a&gt;.&amp;nbsp; Best of all (for me) were 4 four-star and&amp;nbsp;10 &lt;a href="http://dimensionmergescd.codeplex.com/releases/view/25249#ReviewsAnchor"&gt;five-star reviews&lt;/a&gt; (nothing lower) and the expressions of support.&lt;br /&gt;
So&amp;nbsp;that's why I'm turning to you - the people who know what this component does better than anyone!&amp;nbsp; I'd like to run a little contest to come up with a new name for the project - something that speaks to the impact that it has for you in processing incremental dimension loads in SSIS.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Think Out of the Box&lt;/span&gt;&lt;br /&gt;
Don't restrict yourselves to looking through the thesaurus to find an adjective to tack on to "SCD Component" like I did.&amp;nbsp; Think unique.&amp;nbsp;&amp;nbsp;A descriptor that's funny, insightful, or just plain accurate will do - but not something you'd hear everyday.&amp;nbsp; Send me your idea for the full name of the component, as well as something shorter if you get out of breath saying the full name.&amp;nbsp; (An&amp;nbsp;obvious&amp;nbsp;nickname would be&amp;nbsp;the acronym... but you can do better, right?)&amp;nbsp; &lt;br /&gt;
Leave your ideas (and lobby for your favourites) in the comments, send an email to toddmcdermid at live.ca, tweet to &lt;a href="http://www.twitter.com/Todd_McDermid"&gt;@Todd_McDermid&lt;/a&gt;, or tell me in-person at SQL Saturday #65.&lt;br /&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1paB-e1Nq3fpLEVlnG9giG5Sd3tFCzifPO00_-o19vvHert5rc348IMoSC2GAgriIfdmDSNlnrd6xwEYWefbdIb1eLrFrrzvvL/2011-02-25%20Windows%207%20Ultimate.jpg?psid=1" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" l6="true" src="http://7y0rtw.blu.livefilestore.com/y1paB-e1Nq3fpLEVlnG9giG5Sd3tFCzifPO00_-o19vvHert5rc348IMoSC2GAgriIfdmDSNlnrd6xwEYWefbdIb1eLrFrrzvvL/2011-02-25%20Windows%207%20Ultimate.jpg?psid=1" width="181" /&gt;&lt;/a&gt;&lt;span style="color: #e69138; font-size: large;"&gt;The Incentive&lt;/span&gt;&lt;/div&gt;Seriously - you need an incentive other than contributing to the community?&amp;nbsp; Of course you don't - but I have one for you anyway.&amp;nbsp; The winner - chosen at my sole discretion - will get a boxed Windows 7 Ultimate x64.&amp;nbsp; You'll probably have to patch it to SP1 by yourself... but you guys develop SSIS ETL packages, so I know you're used to a little manual hackery.&amp;nbsp; (I may also have a little something for the funniest entry - I'm talkin' shooting-milk-out-the-nose funny...)&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Time Limit&lt;/span&gt;&lt;br /&gt;
All good things must come to an end - and this contest will too.&amp;nbsp; You've got &lt;strong&gt;one week&lt;/strong&gt; - until midnight Pacific Time on&amp;nbsp;Friday, March 4th to&amp;nbsp;send me the moniker that should emblazon the best SCD option for SSIS.&amp;nbsp; Stay tuned for the results!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-1807093634989755312?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=9F8HoAGY2E0:4oIX2LEWjVA:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=9F8HoAGY2E0:4oIX2LEWjVA:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=9F8HoAGY2E0:4oIX2LEWjVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=9F8HoAGY2E0:4oIX2LEWjVA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=9F8HoAGY2E0:4oIX2LEWjVA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=9F8HoAGY2E0:4oIX2LEWjVA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/9F8HoAGY2E0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/1807093634989755312/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=1807093634989755312" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1807093634989755312?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1807093634989755312?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/9F8HoAGY2E0/changes-to-ssis-slowly-changing.html" title="Changes to the SSIS Slowly Changing Dimension Component" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/02/changes-to-ssis-slowly-changing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4AQXo6eyp7ImA9Wx9bEkk.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-5307518867263678502</id><published>2011-02-20T16:09:00.000-08:00</published><updated>2011-02-20T16:09:00.413-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-20T16:09:00.413-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><title>Windows Phone 7 and OneNote</title><content type="html">I'd never used OneNote before I picked up my Windows Phone 7 - but it's extremely handy, even more so than the Notes or Tasks that I'd used for the same purposes on my BlackBerry.&amp;nbsp; The only downside was that they (still) don't have notifications attached, which means OneNote notebooks aren't a replacement for Outlook Tasks.&amp;nbsp; That said, the ability to synchonize to the cloud allows better access - from any computer anywhere - rather than just from computers that I have my Outlook client installed on.&amp;nbsp; In addition, the formatting capabilities of OneNote are very useful compared to Outlook notes or tasks.&amp;nbsp; I find myself recording more information in my notebooks - because it lends itself to better organization, and it's easier to get at.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's Possible Now&lt;/span&gt;&lt;br /&gt;
The &lt;a href="http://www.microsoft.com/windowsphone/en-ca/howto/wp7/office/use-office-onenote-mobile.aspx"&gt;Windows Phone how-to pages&lt;/a&gt; include information on how to set up a "default" synchronizing notebook called "Personal (Web)" on your SkyDrive.&amp;nbsp; This (inexplicably) shows up on the phone with a section called "Unfiled Notes" and you're warned against changing it.&amp;nbsp; This prevents a useful organizational feature of OneNote - the ability to file notes into sections, and even into different notebooks.&lt;br /&gt;
If you happen to have an internet-accessible corporate SharePoint 2010 server, you can "keep" a copy of those notebooks on the phone and synchronize them with the server.&amp;nbsp; I don't have a SharePoint 2010 server architecture lying about, and my organization is probably not looking to spend a ton to get one.&amp;nbsp; I really wanted to segregate information and realize some of the benefits of multiple sections and notebooks.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Officially, That's It&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;&lt;span style="color: black; font-size: small;"&gt;As far as Microsoft's documentation goes, that's all you can do.&amp;nbsp; They don't mention anything about using more than one notebook.&amp;nbsp; In fact, in all the&amp;nbsp;news I've read on the internet about what's coming in a future update (the &lt;a href="http://www.windowsitpro.com/article/paul-thurrotts-wininfo/One-Year-after-Windows-Phone-Reveal-Updates-Announced-for-2011.aspx"&gt;Mango, 2011H2 update&lt;/a&gt;) is "better" Office integration.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
So you're stuck, right?&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Pushing the Boundaries&lt;/span&gt;&lt;br /&gt;
It turns out you can put any SkyDrive notebook on the phone - although Microsoft doesn't explain how, or tout this capability.&amp;nbsp; It's relatively easy to do, but there are limitations, which is why you aren't hearing this from Microsoft.&amp;nbsp; It's so easy that I didn't realize how seamless it was until I broke it and re-enabled it by accident.&lt;br /&gt;
Quite simply, create any OneNote notebook on your SkyDrive, then use the phone's Internet Explorer to navigate to your Live account to find the document in SkyDrive, and&amp;nbsp;open on it.&amp;nbsp; If you did this on your desktop's IE, it would open in OneNote's WebApp.&amp;nbsp; But on the phone, it switches immediately to the Office Hub, opening the notebook on the phone, and syncs the sections.&lt;br /&gt;
But wait - I said I "broke" this and then fixed it.&amp;nbsp; How did I do that?&amp;nbsp; I&amp;nbsp;changed my phone's Internet Explorer settings to look at the pages in "desktop" mode, not mobile.&amp;nbsp; (Some sites have way too limited "mobile" versions, don't they?)&amp;nbsp; Seems that if you surf to your OneNote notebook in "desktop" mode, it'll fire up the OneNote WebApp, but if you hit it in "mobile" mode, it knows to download and sync it with the Office Hub.&amp;nbsp; Who knew?&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Getting Rid of "Personal (Web)"&lt;/span&gt;&lt;br /&gt;
Great!&amp;nbsp; You can put any OneNote notebook on the phone... so why settle for a hobbled notebook called "Personal (Web)" with an "Unfiled Notes" section that you can't change?&lt;br /&gt;
Only one thing - if you create a new note (page), it needs a notebook to get saved in, and that's the "Unfiled Notes" section of the "Personal (Web)" notebook.&amp;nbsp; Again, the documents don't say this - but you can change that default.&amp;nbsp; Open the Office Hub and tap the "all" button.&amp;nbsp; Tap the "notebooks" pivot heading.&amp;nbsp; Try to tap the garbage can icon, then pick the "Personal (Web)" notebook - the phone will complain, and give you instructions on how to change the default.&amp;nbsp; Just to save you from having to do that, press "OK" and the back button to get back to the notebook screen, and tap and hold the notebook section (not the notebook)&amp;nbsp;you want to set as the default.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Life Isn't Perfect Yet&lt;/span&gt;&lt;br /&gt;
But of course, there are some issues.&amp;nbsp; It seems like the phone reads different "section" information than the WebApp.&amp;nbsp;&amp;nbsp;When you add any notebook to the phone using what I've described, the first section in the notebook is always "Untitled".&amp;nbsp; No matter what you do, you can't rename that.&amp;nbsp; In fact, any section renaming you do on the web using the WebApp doesn't EVER get reflected on the phone.&amp;nbsp; Moreover, if you try to change page names on the phone, you get a sync error.&amp;nbsp; You can view the&amp;nbsp;sync errors&amp;nbsp;on the web, but your only option is&amp;nbsp;to copy the data out of the changed page, because the only resolution you have to sync errors is to delete the version the phone made.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;It'll Do Until Mango&lt;/span&gt;&lt;br /&gt;
I could (and will) ask for more, but this will do.&amp;nbsp; I can now have whatever notebook pages I want on my phone, synced so I can work on them offline, in very high-fidelity. I can structure my notebooks' sections and pages any way I want... as long as I do it right the first time, and delete the automatically added first section.&amp;nbsp; I can even add voice notes, pictures, and video to the pages from the phone.&amp;nbsp; On top of that, with a little tap-and-hold, I can pin any notebook page right to the start menu.&lt;br /&gt;
Personally, I don't see how the one limitation here - section and page naming and syncing - is taking a year to fix.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Recap&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Create your notebook "properly"&amp;nbsp;using the WebApp&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create the notebook&lt;/li&gt;
&lt;li&gt;Add a new section&lt;/li&gt;
&lt;li&gt;Delete the original "Untitled Section"&lt;/li&gt;
&lt;li&gt;Construct your notebook sections and pages as you wish - named perfectly on creation.&lt;/li&gt;
&lt;/ol&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Link&amp;nbsp;the notebook on the phone&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Surf in IE "mobile" mode to the SkyDrive&lt;/li&gt;
&lt;li&gt;Open the notebook&lt;/li&gt;
&lt;/ol&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Limitations&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Notebook, section, and page names can NOT be changed.&amp;nbsp; If you want to rename a section or page, create a new one, move the data in the pages, and delete the original (old) named section/page.&lt;/li&gt;
&lt;/ul&gt;To the cloud!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-5307518867263678502?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw8wJDpGB_o:9LxYt9lX4H8:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Zw8wJDpGB_o:9LxYt9lX4H8:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw8wJDpGB_o:9LxYt9lX4H8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw8wJDpGB_o:9LxYt9lX4H8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=Zw8wJDpGB_o:9LxYt9lX4H8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=Zw8wJDpGB_o:9LxYt9lX4H8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/Zw8wJDpGB_o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/5307518867263678502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=5307518867263678502" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/5307518867263678502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/5307518867263678502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/Zw8wJDpGB_o/windows-phone-7-and-onenote.html" title="Windows Phone 7 and OneNote" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/02/windows-phone-7-and-onenote.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNSXs7eip7ImA9Wx9aFks.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-7083441161396442607</id><published>2011-02-16T06:00:00.000-08:00</published><updated>2011-03-09T00:43:18.502-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T00:43:18.502-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerCentral Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLServerPedia Syndication" /><category scheme="http://www.blogger.com/atom/ns#" term="How To" /><category scheme="http://www.blogger.com/atom/ns#" term="Data Warehousing" /><category scheme="http://www.blogger.com/atom/ns#" term="Dimension Merge SCD" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>How To: Load Dimension Tables with Integration Services - Introduction</title><content type="html">When I first started down the business intelligence and data warehousing road, I needed to learn the foundations of dimensional design.&amp;nbsp; Ralph Kimball's methods seemed appropriate at the time, and they still are for me.&amp;nbsp; The next step was learning how to make Microsoft's BI tool stack follow that methodology, and after that, making the technology work as easily, reliably, and as fast as possible.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;There Are Knowledge Gaps&lt;/span&gt;&lt;br /&gt;
Over the last year, I've noticed that although there's a lot of interest in the last step in that process - making things go fast - there seems to still be a lot of confusion over the first steps.&amp;nbsp; Quite a few interactions I've had with the community lead me to believe that there's a significant number of people skipping over understanding the dimensional model, and how ETL (of any brand or style)&amp;nbsp;should be&amp;nbsp;used to manage loading one.&lt;br /&gt;
I see questions in the MSDN forums asking why the OLE DB Command isn't inserting rows into their dimension table... which clearly demonstrates two problems the asker has.&amp;nbsp; First, they don't understand that the OLE DB Command doesn't insert rows - that's not its purpose.&amp;nbsp; But the second and more fundamental issue is that they don't understand &lt;em&gt;why&lt;/em&gt; it doesn't.&amp;nbsp; They aren't grasping the concept of new row versions and updating old rows.&amp;nbsp; If they understood that, they wouldn't wonder why the OLE DB Command didn't insert rows, because they'd know adding rows to their dimension table shouldn't happen at that point.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;I Sucked Too&lt;/span&gt;&lt;br /&gt;
This also came up quite clearly in my side-project of the Kimball Method SCD component.&amp;nbsp; I assumed (and you know what that means) that people would know what to do with the "New" and "Expired" outputs I'd labeled on the component.&amp;nbsp; I held on to that belief so fundamentally that I created a video intending to demonstrate the performance of the component, but completely ignoring the dimensional modeling accuracy of the demo.&amp;nbsp; In fact, the video showed exactly what &lt;em&gt;not&lt;/em&gt; to do when inserting/updating rows in the dimension table.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;But Then, So Did AdventureWorks&lt;/span&gt;&lt;br /&gt;
I tried to find a fairly simple example of dimension loading that clearly showed "data in" and "data out" and how that mapped to the SSIS SCD Wizard or any other tool.&amp;nbsp; I expected to find that in some Microsoft samples - like the &lt;a href="http://msftisprodsamples.codeplex.com/"&gt;AdventureWorks Integration Services samples&lt;/a&gt;.&amp;nbsp; Unfortunately, the writers of this example also assumed too much about the readers' knowledge of dimensional modeling.&amp;nbsp; The AdventureWorks samples contain an SSIS package specifically named AWDataWarehouseRefresh - implying that it can be used to&amp;nbsp;"refresh" AdventureWorks dimension tables.&amp;nbsp; But it loads dimension tables into SQL Server from a CSV file.&amp;nbsp; A completely populated dimension table - a snapshot in time.&amp;nbsp; No use of the SCD Wizard.&amp;nbsp; No incremental loading.&amp;nbsp; I really can't understand why they thought it would be an accurate demonstration of loading a table in a&amp;nbsp;data warehouse&amp;nbsp;specifically - fact tables OR dimensions.&amp;nbsp; That example applies to &lt;em&gt;any&lt;/em&gt; kind of table, data warehouse or not, and provides no help at all for the specific problem of loading dimension tables on an incremental basis.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;A New Step-By-Step&lt;/span&gt;&lt;br /&gt;
So here's my second attempt at doing it better the first time.&amp;nbsp; I've made a few videos and other resources to try to better explain how to incrementally load dimension tables with SSIS, and I'll be posting them in a series here on my blog.&amp;nbsp;&amp;nbsp;The videos&amp;nbsp;were originally intended to better explain my Kimball Method SCD component and are already available there, but they seem to fit this bill as well.&amp;nbsp; Please do comment on specifics that make them easy or hard to understand.&amp;nbsp; I've made comments through my channels to Microsoft about improving the information available for this kind of thing - but your comments can help me confirm to Microsoft that this isn't all a figment of my imagination.&lt;br /&gt;
The next post in this series will provide and describe the sample data stored in our data warehouse, and the source system that updates will come from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-7083441161396442607?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=znX1zYbt7W8:E8RA-igxg9s:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=znX1zYbt7W8:E8RA-igxg9s:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=znX1zYbt7W8:E8RA-igxg9s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=znX1zYbt7W8:E8RA-igxg9s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=znX1zYbt7W8:E8RA-igxg9s:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=znX1zYbt7W8:E8RA-igxg9s:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/znX1zYbt7W8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/7083441161396442607/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=7083441161396442607" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7083441161396442607?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7083441161396442607?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/znX1zYbt7W8/how-to-load-dimension-tables-with.html" title="How To: Load Dimension Tables with Integration Services - Introduction" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/02/how-to-load-dimension-tables-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNSXs7fSp7ImA9Wx9aFks.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-1306801599052904307</id><published>2011-02-05T16:04:00.000-08:00</published><updated>2011-03-09T00:43:18.505-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T00:43:18.505-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLSaturday" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Dimension Merge SCD" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Speed Up SSIS - February Talks</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/maplessinseattle/2633393114/" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" h5="true" height="125" src="http://7y0rtw.blu.livefilestore.com/y1ptqFc8tip2LIFkrzi4nyOKCqH3jhAFTygYyVkNoABUU3MuUk1pnxd2qavM149aP5BWA4-B-eXM5zodk0yY6mb4HOInesUAVMF/2011-02-05%20Burnout.jpg?psid=1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Improving the performance of packages is always a focus of ETL developers.&amp;nbsp; It should go without saying that your first duty is to make the package &lt;em&gt;work&lt;/em&gt;... after which you can then make it work fast.&amp;nbsp; In an effort to help you out with the latter, I've got two presentations I'm set to deliver this month.&amp;nbsp; The first is to Colin Stasiuk's (&lt;a href="http://benchmarkitconsulting.com/"&gt;blog&lt;/a&gt;|&lt;a href="http://twitter.com/benchmarkit"&gt;twitter&lt;/a&gt;) Edmonton &lt;a href="http://edmpass.com/"&gt;PASS chapter&lt;/a&gt;, and the second is at &lt;a href="http://www.sqlsaturday.com/65/eventhome.aspx"&gt;SQL Saturday #65&lt;/a&gt; in Vancouver.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Diagnosing and Addressing Performance in SSIS&lt;/span&gt;&lt;br /&gt;
On February 16th, the &lt;a href="http://edmpass.com/"&gt;Edmonton PASS chapter&lt;/a&gt; is hosting me virtually to talk on the subject of optimizing SSIS packages.&amp;nbsp; You too can attend this webcast even if you're not there - I can guarantee that, because if it's not broadcast, I won't be able to deliver it, because I'm not going to be there in person either.&lt;br /&gt;
I'll be covering one of the essential steps that too often seems to get overlooked in trying to make SSIS packages "go fast"... and that's knowing how to find out where they're actually "going slowly."&amp;nbsp; If you don't know why this is important, or don't know there are&amp;nbsp;techniques that can help you do this, you should probably make time to sign up.&lt;br /&gt;
I'll have to make a dig or two at Colin's expense during the webcast.&amp;nbsp; He trimmed my bio down on his site... he must not appreciate my humour.&amp;nbsp; Please feel free to feed me some fodder in the comments.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Data Warehouse ETL with Integration Services&lt;/span&gt;&lt;br /&gt;
On February 26th, the famous &lt;a href="http://www.sqlsaturday.com/65/eventhome.aspx"&gt;SQL Saturday&lt;/a&gt; franchise will make its first stop in Vancouver at the Pinnacle Mariott.&amp;nbsp; If you're anywhere close to the area and touch SQL Server, you need to be here.&amp;nbsp; The following week is the &lt;a href="http://mvp.support.microsoft.com/MVPsummit"&gt;Microsoft MVP Summit&lt;/a&gt; in Redmond, which the organizers of Vancouver's SQL Saturday exploited to the fullest.&amp;nbsp; A ton of SQL MVPs will arrive a little sooner than normal to the Summit just to be able to make the short trip up to Vancouver.&amp;nbsp; Some of them will be presenting - for example, SQL rock stars like Brent Ozar and Brad McGehee.&amp;nbsp; Others couldn't get a speaking slot, but they're coming anyway, and they're all open to conversation.&lt;br /&gt;
I was fortunate enough to leverage my "local" credentials to get a session on performing data warehouse ETL with SSIS.&amp;nbsp; I'll start by describing the multiple ways to fill dimension tables with SSIS, leaving you with solid guidelines to pick a technique that&amp;nbsp;performs in&amp;nbsp;your scenario.&amp;nbsp; I'll finish up with the relatively simple&amp;nbsp;techniques&amp;nbsp;involved in fact table population, as well as some optimization techniques to speed the whole process up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-1306801599052904307?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=FNMFmx0J-L4:dNNwBYhQQFY:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=FNMFmx0J-L4:dNNwBYhQQFY:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=FNMFmx0J-L4:dNNwBYhQQFY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=FNMFmx0J-L4:dNNwBYhQQFY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=FNMFmx0J-L4:dNNwBYhQQFY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=FNMFmx0J-L4:dNNwBYhQQFY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/FNMFmx0J-L4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/1306801599052904307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=1306801599052904307" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1306801599052904307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/1306801599052904307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/FNMFmx0J-L4/speed-up-ssis-february-talks.html" title="Speed Up SSIS - February Talks" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/02/speed-up-ssis-february-talks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08MSXk4eyp7ImA9Wx9SE00.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8234602535756469405</id><published>2010-11-22T05:57:00.000-08:00</published><updated>2010-12-02T08:04:48.733-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-02T08:04:48.733-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="SQLSaturday" /><category scheme="http://www.blogger.com/atom/ns#" term="PASS Summit" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>Two Weeks of #SQLAwesomeSauce Over - With More To Come</title><content type="html">What a&amp;nbsp;stellar two week jolt of SQL Server goodness. &amp;nbsp;SQL Connections in Las Vegas the first week of November, then the "big kahuna" of SQL conferences - the PASS Summit in Seattle.&amp;nbsp; It was fantastic to run into people I'd met at the last Summit (in both places!) and meet some new people interested in SQL Server and Integration Services.&amp;nbsp; It's taken me this long to recover and get back (almost) on top of "regular" work. &lt;br /&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pZHzRuHYBU0W18So51if36m2lvmd5rwCmRaAB14dv1CXy5ia0YCTQfiD_NzKAjqwiQMvN7dYeWTzRaHdiZNyh8-qG2ZMuwyMZ/2010-11-22%20Mandalay%20Bay.jpg?psid=1" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" ox="true" src="http://7y0rtw.blu.livefilestore.com/y1pZHzRuHYBU0W18So51if36m2lvmd5rwCmRaAB14dv1CXy5ia0YCTQfiD_NzKAjqwiQMvN7dYeWTzRaHdiZNyh8-qG2ZMuwyMZ/2010-11-22%20Mandalay%20Bay.jpg?psid=1" /&gt;&lt;/a&gt;&lt;span style="color: #e69138; font-size: large;"&gt;SQL Connections Fall 2010&lt;/span&gt;&lt;/div&gt;Of course, the main reason I was in Vegas was to do some presenting, and overall was very pleased with the turnout and participation of the audience.&amp;nbsp;&amp;nbsp;My third session (on Script components) really felt too rushed to me - and it won't surprise me at all if that's my lowest rated.&amp;nbsp; For those of you who do want to see the slide decks and sample code from those sessions, here they are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Data Warehouse ETL with Integration Services: &lt;a href="http://cid-0c76c3cbdb305921.office.live.com/view.aspx/Presentations/2010-11-03%20Data%20Warehouse%20ETL%20with%20Integration%20Services.pptx"&gt;slides&lt;/a&gt;, &lt;a href="http://public.blu.livefilestore.com/y1pQYXeqQVP0n8o8smLKZf0xwZwD0f8qGQbXwUzwCLgdm8YN5Xto4-8a4USEwBCv7200VNEu2gzOrCFpau5czMACA/2010-11-03%20DWETLDemo.zip?download&amp;amp;psid=1"&gt;sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In-Depth with the SSIS Script Task: &lt;a href="http://cid-0c76c3cbdb305921.office.live.com/view.aspx/Presentations/2010-11-03%20In-Depth%20with%20the%20SSIS%20Script%20Task.pptx"&gt;slides&lt;/a&gt;, &lt;a href="http://public.blu.livefilestore.com/y1poxXFOv5wQiiEM8m7OB6UaA2Af5iI2CZV7gl0Ydyn6r7LNaOaClucy694-ESZLKJCPggCdVLxzc-QmePbnnnccg/2010-11-03%20In-Depth%20with%20the%20SSIS%20Script%20Task.zip?download&amp;amp;psid=1"&gt;sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In-Depth with the SSIS Script Component: &lt;a href="http://cid-0c76c3cbdb305921.office.live.com/view.aspx/Presentations/2010-11-04%20In-Depth%20with%20the%20SSIS%20Script%20Component.pptx"&gt;slides&lt;/a&gt;, &lt;a href="http://public.blu.livefilestore.com/y1pahUU7SLkwHDS216wlDvgNsHRWz--ENzxtTacibGP5DJadIeWXzJ6cMpwTZmQ_Ae61h5ZQRDMcmajt67_k2M3Ew/2010-11-04%20In-Depth%20with%20the%20SSIS%20Script%20Component.zip?download&amp;amp;psid=1"&gt;sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="color: #e69138; font-size: large;"&gt;PASS Community Summit 2010&lt;/span&gt;&lt;br /&gt;
The following week was the pinnacle event of the SQL Server world, and was my "best Summit ever."&amp;nbsp; Among a ton of things, some highlights for me were the Birds of a Feather lunch, and building towers with the SSIS Dev team with post-it notes.&amp;nbsp; Of course, it wasn't all play, or that's what they tried to tell me.&amp;nbsp; I had a chalk talk on debugging SSIS packages, and participated in a very fun Lightning Talk session with six other fabulous speakers, including the comedian of the SQL world, &lt;a href="http://sqlblog.com/blogs/rob_farley/"&gt;Rob Farley&lt;/a&gt;.&amp;nbsp; &lt;a href="http://www.kendalvandyke.com/"&gt;Kendal Van Dyke&lt;/a&gt; was also very gracious in letting a bunch of us "help him out" with his speaking and blogging session.&amp;nbsp; I hope we didn't derail him too much...&lt;br /&gt;
The chalk talk has a &lt;a href="http://cid-0c76c3cbdb305921.office.live.com/view.aspx/Presentations/2010-11-10%20Exploring%20Debugging%20Techniques%20in%20SSIS.pptx"&gt;slide deck&lt;/a&gt; with a few suggestions on it - we only got to investigate a very few - 40 minutes is SHORT.&amp;nbsp; Take from it what you will, it's not your typical deck.&amp;nbsp; Also very atypical was my lightning talk deck - &lt;a href="http://cid-0c76c3cbdb305921.office.live.com/view.aspx/Presentations/2010-11-11%20Lightning%20Talk%20-%20SSIS%20Data%20Flow.pptx"&gt;23 slides, seven words&lt;/a&gt;... I guess you had to be there.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Coming Up Next...&lt;/span&gt;&lt;br /&gt;
This Tuesday, November 23rd, the &lt;a href="http://bi.sqlpass.org/"&gt;BI Virtual Chapter of PASS&lt;/a&gt; is hosting&amp;nbsp;my session on Loading Dimension Tables with SSIS.&amp;nbsp; Very similar to what I did at SQL Connections, but focusing only on dimension table loading.&amp;nbsp; Brush up on slowly changing dimensions before you attend - I'm presuming you've experienced the joy and pain of loading them prior.&amp;nbsp; I'll walk through alternatives to the SCD Wizard, giving you a good feel of what you should try to get by its limitations.&amp;nbsp; (&lt;strong&gt;UPDATE 2011-11-30&lt;/strong&gt;: the recording is now available on their website.)&lt;br /&gt;
Just around the corner from that - &lt;a href="http://www.sqlsaturday.com/65/eventhome.aspx"&gt;SQL Saturday #65&lt;/a&gt; in Vancouver on February 26th!&amp;nbsp; I don't have any sessions submitted yet - but I'll get to that.&amp;nbsp; It's looking like a very special SQL Saturday - Scott Stauffer brilliantly picked the weekend before the &lt;a href="http://mvp.support.microsoft.com/MVPsummit"&gt;MVP Summit&lt;/a&gt; in Redmond.&amp;nbsp; Just a couple weeks after announcing the date, MVPs Bill Pearson, John Welch, Denny Cherry, Gail Shaw, and Aaron Bertrand have submitted multiple sessions each, as well as MCM Robert Davis from Microsoft.&amp;nbsp; I expect that there will be many more MVPs and Microsoft folks presenting and attending, not to mention the fantastic speakers that don't (yet) have those letters to tag after their names (but ought to).&lt;br /&gt;
See you on a monitor, or in-person soon!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://7y0rtw.blu.livefilestore.com/y1pegjUrzVwbf9Bgrd8yIyVB0aDJSgZ3JU_BZb1yisyWYymVKoeBrz_fwmwQMbnQ5HKipht6xfPFtXMniOMfioJyHxWU6U3A46A/2010-11-22%20Vancouver.bmp?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" ox="true" src="http://7y0rtw.blu.livefilestore.com/y1pegjUrzVwbf9Bgrd8yIyVB0aDJSgZ3JU_BZb1yisyWYymVKoeBrz_fwmwQMbnQ5HKipht6xfPFtXMniOMfioJyHxWU6U3A46A/2010-11-22%20Vancouver.bmp?psid=1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5269388141224850580-8234602535756469405?l=toddmcdermid.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=nbpZ-NhC0HQ:7vpyTjSmen8:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=nbpZ-NhC0HQ:7vpyTjSmen8:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=nbpZ-NhC0HQ:7vpyTjSmen8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=nbpZ-NhC0HQ:7vpyTjSmen8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=nbpZ-NhC0HQ:7vpyTjSmen8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=nbpZ-NhC0HQ:7vpyTjSmen8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/nbpZ-NhC0HQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8234602535756469405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5269388141224850580&amp;postID=8234602535756469405" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8234602535756469405?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8234602535756469405?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/nbpZ-NhC0HQ/two-weeks-of-sqlawesomesauce-over-with.html" title="Two Weeks of #SQLAwesomeSauce Over - With More To Come" /><author><name>Todd McDermid</name><uri>http://www.blogger.com/profile/10444379572904639267</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_j-IJu2TFu4o/Sfnl3dmWjFI/AAAAAAAAAJQ/FirSVXTfqQE/s1600-R/Headshot.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2010/11/two-weeks-of-sqlawesomesauce-over-with.html</feedburner:origLink></entry></feed>

