<?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:blogger="http://schemas.google.com/blogger/2008" 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;DEQCSXg4fip7ImA9WhFTEkU.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580</id><updated>2013-06-03T12:06:08.636-07: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="Security" /><category term="PerformUpgrade" /><category term="Microsoft SQL Server" /><category term="Business Intelligence" /><category term="Analysis Services (SSAS)" /><category term="Best Practice" /><category term="SQLServerCentral Syndication" /><category term="Kimball" /><category term="UnSQL Friday" /><category term="Business Value" /><category term="Community" /><category term="Visual Basic" /><category term="SQLSaturday" /><category term="Administrivia" /><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="Microsoft Office" /><category term="Quick Hit" /><category term="OpenXML" /><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="NoSQL" /><category term="Presentations" /><category term="PASS" /><category term="SSIS Control Flow" /><category term="Guerilla BI" /><category term="Data Explorer" /><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>155</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;DkMGQXg_fip7ImA9WhBWF0s.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8508407617233421076</id><published>2013-04-12T04:00:00.000-07:00</published><updated>2013-04-12T04:00:20.646-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-12T04:00:20.646-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Access" /><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="Data Explorer" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Data Explorer Rocks - Let's Get an Enterprise Story</title><content type="html">First - it's been a while since I've posted.  I have quite a few articles in the pipe, but they're "heavier", so take longer to flesh out and publish.  I thought I'd start the ball rolling by commenting on the newly released &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36803" target="_blank"&gt;Data Explorer Preview for Excel&lt;/a&gt;.&amp;nbsp; If you are an "information worker" that is copying and pasting data into Excel, then cleaning it up, &lt;strong&gt;download and install this now&lt;/strong&gt;.&amp;nbsp; It definitely has the potential to save you tons of time redoing that work, or remembering what you did, or where you got the data later.&amp;nbsp; There are plenty of resources to help you get started with Data Explorer, with walkthroughs and samples - Bingle to your heart's content.&amp;nbsp; I'll wait.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Commentary&lt;/span&gt;&lt;br /&gt;
As most of you know, I'm a DW and SSIS guy, so I'm interested in "enterprise" tools for ETL - things that can be managed, scheduled, scaled, and monitored.&amp;nbsp; So why am I commenting on Data Explorer?&amp;nbsp; First, it is very cool.&amp;nbsp; But my real intention is to question and to elicit some reaction as to the future of Data Explorer.&amp;nbsp; Data Explorer is currently a "self-service" BI tool just like PowerPivot was, but PowerPivot has matured somewhat since v1.&amp;nbsp; PowerPivot workbooks can be transferred (by two methods) from the wild west of self-service to the Victorian rigour of IT governance.&amp;nbsp; &lt;br /&gt;
The first method is pretty slick, transparent to business users, and pretty effective.&amp;nbsp; IT simply has to set up their SharePoint farm appropriately with PowerPivot for SharePoint.&amp;nbsp; Business users then simply take advantage of SharePoint's document repositories to collaborate and share.&amp;nbsp; They'll do this of their own accord, because it's much more convenient than email attachments, and because you've berated them often enough about clogging your Exchange server with dozens of copies of a very large workbook distributed to a large number of recipients.&amp;nbsp; What happens in the background is that SharePoint strips out the PowerPivot model from the Excel workbook and loads it into the PowerPivot for Excel shared service.&amp;nbsp; In addition to the sharing benefits (not needing Excel or PowerPivot addin installed), IT immediately gets visibility and&amp;nbsp;manageability of the underlying SSAS tabular model.&lt;br /&gt;
The second method is a manual, deliberate process.&amp;nbsp; An IT resource can open the workbook in Visual Studio, extract the PowerPivot tabular model (just like happens&amp;nbsp;in SharePoint), work with it (to extend and/or validate it), then deploy it to an IT-managed SSAS server.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Data Explorer Growth Options&lt;/span&gt;&lt;br /&gt;
What's the story for Data Explorer?&amp;nbsp; Right now, there doesn't appear to be one, but I'm sure hoping (and asking) Microsoft to think about one.&amp;nbsp; The benefits are quite similar to those achieved by the PowerPivot example.&amp;nbsp; If we can "grow up" the Data Explorer transforms, IT can validate them, stabilize them, and manage data lineage concerns.&lt;br /&gt;
Similarly to PowerPivot, I can see a couple options here.&amp;nbsp; First, they could simply create a "Data Explorer for SharePoint" complement to the "Data Explorer for Excel" shared service.&amp;nbsp; When you uploaded an Excel workbook that uses Data Explorer, SharePoint would extract the DE part, store it in some kind of new DE repository/server, and data would be funneled through that server when the workbook was refreshed as an Excel Service.&amp;nbsp; Monitoring and connection management are natural SharePoint extensions.&amp;nbsp; Being able to view and/or edit the transform in a "management portal"... less likely - just open the workbook.&amp;nbsp; Share a DE implementation between workbooks, or surface the DE result as a business data connection?&amp;nbsp; I can see the appeal.&lt;br /&gt;
But that first option is likely to be unappealing to a good portion of IT shops, for much the same reason that the first PowerPivot option is.&amp;nbsp; It's not using tooling they're already familiar with and skilled up for.&amp;nbsp; It's not "enterprise-grade".&amp;nbsp; And it's baked into SharePoint, which has a particularly bad stink to SQL Server professionals.&lt;br /&gt;
What I'd like to see is the ability to extract the Data Explorer bits from a workbook into SSIS.&amp;nbsp; What would this look like?&amp;nbsp; I can see two options - both of which would have to be a ways off in development, simply because Data Explorer isn't done yet.&lt;br /&gt;
First, I could see a "translation" layer, where the DE "steps" are converted into native SSIS data flow components.&amp;nbsp; Some of these components may not exist now (depending on what DE steps ultimately get shipped).&amp;nbsp; There would be some development required on the SSIS side to address that.&lt;br /&gt;
Second, I could see new DE components created for SSIS - possibly replacing or duplicating current components.&amp;nbsp; That's a bigger job (I think), but may give Microsoft the opportunity to rationalize both tools at the same time.&amp;nbsp; I don't know if they're interested in doing that.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Final Thoughts&lt;/span&gt;&lt;br /&gt;
One thing that all of the above still doesn't solve - and this is a little off-topic - is custom transforms.&amp;nbsp; I don't currently see a method in DE to create your own transform.&amp;nbsp; That's probably a little beyond your average information worker.&amp;nbsp; But it's not beyond "the ecosystem".&amp;nbsp; I can definitely see third parties wanting to create "address parsing" transforms and the like.&amp;nbsp; I think this is a great opportunity to add that kind of curated "store" concept to DE/SSIS, to take over from amateurish efforts like mine.&lt;br /&gt;
So when you see a demo of Data Explorer given, raise your hand as a data professional and ask the presenter about the enterprise story.&amp;nbsp; That feedback will make it back to the product team, and make us all happier.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=3WJ6oB2OIbY:LzEJzcxpR4w:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=3WJ6oB2OIbY:LzEJzcxpR4w:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=3WJ6oB2OIbY:LzEJzcxpR4w: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=3WJ6oB2OIbY:LzEJzcxpR4w: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=3WJ6oB2OIbY:LzEJzcxpR4w:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=3WJ6oB2OIbY:LzEJzcxpR4w:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/3WJ6oB2OIbY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8508407617233421076/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2013/04/data-explorer-rocks-lets-get-enterprise.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8508407617233421076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8508407617233421076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/3WJ6oB2OIbY/data-explorer-rocks-lets-get-enterprise.html" title="Data Explorer Rocks - Let's Get an Enterprise Story" /><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/2013/04/data-explorer-rocks-lets-get-enterprise.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEEQ3s7fCp7ImA9WhNTGU8.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4406982493364519322</id><published>2012-10-22T05:00:00.000-07:00</published><updated>2012-10-22T10:23:22.504-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-22T10:23:22.504-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>Data Flow Optimization - Collapse Sparse Buffers</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://skydrive.live.com/#cid=0C76C3CBDB305921&amp;amp;id=C76C3CBDB305921%212291" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="https://vx0hqg.sn2.livefilestore.com/y1pAQv4j_CIXUwyzzJ6Kas-5nZOSHhMQ_XTC36IlISc566tqRNTGkDncgRsxvjLYthAnN4yA2TdfNkQb6rDGOBOarbNVjzgEX8A/Windows%20Memory%20Warning.jpg?psid=1" width="320" /&gt;&lt;/a&gt;I'll warn you straight off that this is an advanced technique for a fairly small use case - it is NOT a "try this for all data flow performance problems" type of technique.&amp;nbsp; (Much like the typical "adjust your buffer size"&amp;nbsp;useless advice.)&amp;nbsp; I ran into errors and warnings in&amp;nbsp;my data flow about "A buffer failed while allocating&amp;nbsp;X bytes" followed by "The system reports&amp;nbsp;Y percent memory load...".&amp;nbsp; The second error message itself&amp;nbsp;reports very little memory load, and took some digging to get an idea as to what was going on.&amp;nbsp; If you find yourself in this position, AND have a data flow similar to the one I describe, perhaps this can help.&lt;/div&gt;
&lt;h2&gt;
&lt;span style="color: #e69138;"&gt;How Small A Use Case Is It?&lt;/span&gt;&lt;/h2&gt;
For myself - pretty darn small.&amp;nbsp; I can only assume it's also fairly "edge" in general out there as well.&amp;nbsp; In my specific situation, I'm attempting to load 22 million rows into a fact table.&amp;nbsp; At the point in the data flow where this problem crops up, the row is 88 bytes wide (not counting overhead).&amp;nbsp; I'm running this on my laptop with 8GB of RAM, over 4GB "free".&amp;nbsp; My data flow should only take about 2GB of RAM to process (again - not counting overhead, and being VERY simplistic).&amp;nbsp; I should have enough headroom.&lt;br /&gt;
However, I am doing something fairly interesting in the data flow that I've&amp;nbsp;described in&amp;nbsp;a partially-finished blog entry that's been unfinished for months and months.&amp;nbsp; I'm allocating a total quantity over thousands of rows, and want to make sure I have no rounding errors in the allocation.&amp;nbsp; In other words, I'm splitting a total dollar amount amongst a lot of rows according to a proportional formula, and I want to make sure it all adds back up to the original amount.&lt;br /&gt;
I'll leave it to that unfinished blog post I'll publish in the future to describe in detail how and why I go about doing it the way I do.&amp;nbsp; But I have to describe it briefly to demonstrate the issue.&amp;nbsp;&amp;nbsp;It involves using a conditional split to funnel off a small percentage of rows (about 3%) from the main flow.&amp;nbsp; The intent is to add/subtract whatever "remainder" or rounding error that occurred in the allocation calculation(s) to be adjusted on those rows.&amp;nbsp; It also involves a Sort, Aggregate, and Merge Join - a lot of blocking and partially blocking components - just the kind of thing that usually&amp;nbsp;clogs up memory - but doesn't in the way you'd think in this case.&lt;br /&gt;
&lt;h2&gt;
&lt;span style="color: #e69138;"&gt;More Diagnostic Details&lt;/span&gt;&lt;/h2&gt;
Well - the errors you (and I) get seem to indicate that SSIS is failing for no reason.&amp;nbsp; Here are verbatim errors from my output window:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Error: 0xC0047012 at Calculate Facts and Record Years: A buffer failed while allocating 79576 bytes.&lt;br /&gt;
Error: 0xC0047011 at Calculate Facts and Record Years: The system reports 68 percent memory load. There are 8577282048 bytes of physical memory with 2730938368 bytes free. There are 8796092891136 bytes of virtual memory with 8790742302720 bytes free. The paging file has 9099673600 bytes with 11153408 bytes free.&lt;/blockquote&gt;
"68%" usage on an 8GB system, and it's complaining about not having enough memory?&amp;nbsp; Seriously?&amp;nbsp; 2.7GB physical memory "free", and there's still a buffer allocation failure?&lt;br /&gt;
I'm definitely no expert on analyzing what's going on, but I did break out the few tools I fumble around with.&amp;nbsp; First, Task Manager.&amp;nbsp; When I watch Task Manager's processes tab during a BIDS execution, I see that DTSDebugHost is (of course) doing all the work.&amp;nbsp; The default columns shown in Task Manager include a "Memory" column - but it never gets very large - not even close to the 2GB I think should see if my pipeline is stuffed with 22 million rows.&amp;nbsp;&amp;nbsp;If you run the second tool,&amp;nbsp;"perfmon /res" (I highly recommend it!) and watch memory usage as the data flow runs, you'll see a TON of "free memory" - even as SSIS (and probably windows itself, with little popup messageboxes like at the top of this article) is telling you that you're running out of memory.&amp;nbsp; A little discomforting, to say the least...&lt;br /&gt;
&lt;div style="clear: both; text-align: left;"&gt;
But on that same Perfmon screen, look over to the right-hand side at the graphs.&amp;nbsp; One of them shows the "Commit Charge" - and you'll see this one climbing steadily until it hits 100%.&amp;nbsp; Then (sometimes) all hell breaks loose and your flow stops in its tracks with what looks like a bogus memory error.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://skydrive.live.com/#cid=0C76C3CBDB305921&amp;amp;id=C76C3CBDB305921%212290" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="233" src="https://ugidiw.sn2.livefilestore.com/y1pzFG1xDozKva15Bl2_5sDS2oGNU775YCL_SmZrXC3-scSsxrnoGd_coLCwhl6Bj0pphQHjhufiv-QF37vg1AJRmoOy_EJl1Cy/High%20Commit%20Charge%20with%20Free%20Memory.jpg?psid=1" width="400" /&gt;&lt;/a&gt;The problem with the Task Manager memory number (and the "free" numbers seen in Perfmon)&amp;nbsp;seems to be that this "memory" column isn't exactly the best one to be looking at.&amp;nbsp; It's for the process' "Private Working Set", which (if &lt;a href="http://windows.microsoft.com/en-US/windows-vista/What-do-the-Task-Manager-memory-columns-mean"&gt;I understand correctly&lt;/a&gt;) is the memory that the process is actively using exclusively.&amp;nbsp; Taking the hint from Perfmon's graphs, the memory that really counts in this case is the "Commit Charge."&amp;nbsp; This appears to be memory that the process has allocated to it, perhaps that it has already used, but hasn't been released (by Windows) back to the big usable pool yet.&lt;/div&gt;
If you change the columns you're looking at in Task Manager to add the "Memory (Commit Charge)" one - you'll now see a more accurate picture that matches up with the complaints you're getting from Windows and SSIS about memory pressure.&amp;nbsp; In my flow execution, the Private Working Set doesn't exceed 500MB, but the Commit Charge climbs above 4GB!&lt;br /&gt;
&lt;h2&gt;
&lt;span style="color: #e69138;"&gt;What I Believe Is Happening&lt;/span&gt;&lt;/h2&gt;
There's got to be a reason for this "excessive" commit charge, while actual memory "usage" is quite low, doesn't there?&amp;nbsp; I can't explain it exactly, but my hunch is that it's due to memory fragmentation.&amp;nbsp; Your package may not be actively holding on to that many bytes in memory, but if those bytes are sparsely used in a larger block of memory, then Windows may not be able to reclaim it for other processes (or itself).&lt;br /&gt;
It was that thought of "sparse usage" that made me look more closely at the Conditional Split I was using.&amp;nbsp; For those of you that understand the Data Flow a little deeper than most - and you should if you read my blog - the Conditional Split doesn't make copies of data, or move data into two separate buffer stacks.&amp;nbsp;&amp;nbsp;It handles "splits" much more efficiently than that.&amp;nbsp; Well, I should say efficiently with respect to CPU cycles and memory copying... because in our case, this efficiency is part of the problem.&amp;nbsp; The Conditional Split adds a column to your data flow that only the data flow engine can see.&amp;nbsp; (You can't - don't try.)&amp;nbsp; Simplistically, this column is filled with the name of the output that row is supposed to flow out of.&amp;nbsp; Components attached to Conditional Split outputs get ALL the buffers with ALL the rows that entered the Conditional Split - but they only operate on those rows with the right output indicator in that special hidden column.&lt;br /&gt;
The net effect of this behaviour, in combination with how the Sort component works, is an accumulation in memory of a set of&amp;nbsp;very sparse&amp;nbsp;data flow buffers.&amp;nbsp; In my flow, one of my Conditional Split outputs - the one with 97% of the rows -&amp;nbsp;&amp;nbsp;is processed in a part of the flow where they get "consumed" by a Merge Join.&amp;nbsp; The buffers that contain those rows ought to get released from memory, because those rows are no longer used.&amp;nbsp; Except... for the 3% that went out the other output from the Conditional Split.&lt;br /&gt;
The 3% flow gets "consumed" by a Sort component.&amp;nbsp; Except that I don't really think they do (right away).&amp;nbsp; I believe that the Sort simply queues up the buffers, waiting for all of them to be given to it.&amp;nbsp; It's doing what it's been designed to do - acting like a fully blocking component that needs to see all the buffers/rows before it emits any.&amp;nbsp; However, the Sort is acting particularly poorly (in this case) because it's keeping the incoming rows inside the incoming buffers.&amp;nbsp; Normally this isn't bad, and would actually be very&amp;nbsp;smart.&amp;nbsp; In this edge case of ours, it would make more sense to copy the incoming rows to another internal memory structure to release the 97% of rows that are "empty" in those buffers.&amp;nbsp; But in normal cases, where you're sorting all (or almost all of) the rows inside an incoming buffer, it would be a waste of CPU and memory to make a copy of the incoming rows... that you're just&amp;nbsp;going to discard anyway once you emit the sorted rows.&lt;br /&gt;
Bottom line - the Sort ends up holding on to (almost) EVERY ONE of my sparsely populated buffers.&amp;nbsp; Buffers sized to hold 22 million rows, but only holding 1 million rows marked for its use by the Conditional Split.&lt;br /&gt;
&lt;h2&gt;
&lt;span style="color: #e69138;"&gt;The Solution - Defragment Your Buffers!&lt;/span&gt;&lt;/h2&gt;
For those of you that scrolled to the bottom to get the TL;DR solution... you shouldn't have, because this probably won't work for you.&amp;nbsp; It'll only work for those people that understand the problem they're having.&lt;br /&gt;
That said, it's fairly harmless to try this solution out.&amp;nbsp; But do record baseline performance metrics on what your data flow's memory, CPU, disk, and time usage looks like so that you can determine if there's an improvement or not.&lt;br /&gt;
How do you "defragment" those sparsely populated buffers?&amp;nbsp; Use a Union All.&lt;br /&gt;
The Union All is another asynchronous component just like the Sort - but it doesn't block like the Sort does.&amp;nbsp; The Sort component won't process &lt;em&gt;any&lt;/em&gt; inbound row until it has accumulated all of them.&amp;nbsp; The Union All processes &lt;em&gt;every&lt;/em&gt; incoming row as soon as it sees it... it just doesn't emit output buffers until it has full ones (or it's reached the end of the data).&lt;br /&gt;
We're going to use that behaviour to our advantage here.&amp;nbsp; If you simply drop a Union All in your data flow between your Conditional Split and Sort, you'll be telling SSIS to behave in a&amp;nbsp;much better manner for your (and my) unusual data flow.&amp;nbsp; The "sparse" buffers that get emitted by the Conditional Split will get "consumed" by the Union All.&amp;nbsp; (In actuality, I believe those rows get marked as "dead" by the data flow engine, and when all rows in a buffer are marked "dead", the engine can dispose of the buffer.)&amp;nbsp; New buffers emitted by the Union All are dense, requiring much less "commit charge" to hold.&lt;br /&gt;
It worked wonders for me on this particular data flow.&amp;nbsp; My Commit Charge was only a few hundred KB higher than my Private Working Set for the package execution, and I received no memory warnings or errors on multiple executions.&amp;nbsp; If you know you're manufacturing "sparse" buffers in your Data Flow - a Union All might be able to help you out.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=lcydpjFZW_c:lc_63yhv7ss:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=lcydpjFZW_c:lc_63yhv7ss:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=lcydpjFZW_c:lc_63yhv7ss: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=lcydpjFZW_c:lc_63yhv7ss: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=lcydpjFZW_c:lc_63yhv7ss:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=lcydpjFZW_c:lc_63yhv7ss:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/lcydpjFZW_c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4406982493364519322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/10/data-flow-optimization-collapse-sparse.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4406982493364519322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4406982493364519322?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/lcydpjFZW_c/data-flow-optimization-collapse-sparse.html" title="Data Flow Optimization - Collapse Sparse Buffers" /><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/2012/10/data-flow-optimization-collapse-sparse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQH84fip7ImA9WhNTE00.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-4339262107632097613</id><published>2012-10-15T05:00:00.000-07:00</published><updated>2012-10-15T05:00:01.136-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-15T05:00:01.136-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="CodePlex" /><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="Integration Services (SSIS)" /><title>SSIS Raw File Viewer (2008/2008R2)</title><content type="html">Back in 2007, Simon Sabin &lt;a href="http://sqlblogcasts.com/blogs/simons/archive/2007/01/11/SSIS-Rawfile-viewer---now-available.aspx"&gt;published a file viewer for SSIS RAW files&lt;/a&gt;.&amp;nbsp; Of course, that was for Integration Services 2005.&amp;nbsp; Simon Trigona, one of my colleagues at Moulding and Millwork, recently built up a new 2008/2008R2 RAW file viewer from source that &lt;a href="http://social.msdn.microsoft.com/Forums/pl-PL/sqlintegrationservices/thread/e6288076-a23c-4b86-8836-24955434a577"&gt;was published on the MSDN SSIS forums&lt;/a&gt;.&amp;nbsp; He's built a &lt;a href="http://rawviewer.codeplex.com/"&gt;CodePlex project for it&lt;/a&gt;, so you can see the internals and modify it as you see fit.&lt;br /&gt;
Of course, I don't know if this will work for SSIS 2012 - my bet is no... I haven't yet had the time to migrate, but hopefully that'll come soon.&amp;nbsp; When it does, we'll be making any necessary adjustments.&lt;br /&gt;
Thanks to Simon Sabin and&amp;nbsp;Mitulkumar Brahmbhatt.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=tR_EuinBQkQ:sxqoarHIHJI:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=tR_EuinBQkQ:sxqoarHIHJI:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=tR_EuinBQkQ:sxqoarHIHJI: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=tR_EuinBQkQ:sxqoarHIHJI: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=tR_EuinBQkQ:sxqoarHIHJI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=tR_EuinBQkQ:sxqoarHIHJI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/tR_EuinBQkQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/4339262107632097613/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/10/ssis-raw-file-viewer-20082008r2.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4339262107632097613?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/4339262107632097613?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/tR_EuinBQkQ/ssis-raw-file-viewer-20082008r2.html" title="SSIS Raw File Viewer (2008/2008R2)" /><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/2012/10/ssis-raw-file-viewer-20082008r2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ERXw7fCp7ImA9WhJUFEg.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-6720809433907381013</id><published>2012-09-12T06:00:00.000-07:00</published><updated>2012-09-12T06:00:04.204-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-12T06:00:04.204-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Administrivia" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>The Only Thing Constant is Change</title><content type="html">The season&amp;nbsp;is about to change for all of us, but this past Summer has been quite an eventful one for me.&amp;nbsp; I won't bore you all with the details, but there are a few things I think will be of interest to readers here.&lt;br /&gt;
Scott Stauffer, whom I lured to come work with me full-time at Moulding and Millwork couldn't bear my authoritarian rule, and is back on the freelance circuit helping more people than just me.&amp;nbsp; (I jest about the authoritarian comment - I'm sure I'm not that bad to work with, although I &lt;em&gt;am&lt;/em&gt; sure&amp;nbsp;our organization&amp;nbsp;was too slow for Scott's faster pace.)&amp;nbsp; Good wishes to Scott - I'll still see him very often, as I'll be one of his clients now.&amp;nbsp; Hey!&amp;nbsp; No Dilbert-esque "rehired at a higher rate as a contractor" comments, please ;)&lt;br /&gt;
Due in no small part to Scott's efforts, we now have a true Data Warehouse team and program here at M&amp;amp;M.&amp;nbsp; That's even better than a "project" that implies some kind of time limit, which would have been better than the skunkworks guerilla work that I'd been pursuing before Scott arrived.&amp;nbsp; I must say that the&amp;nbsp;conventional wisdom about getting Data Warehousing going in an organization is completely correct in my case as well - if you don't have an executive sponsor that's fully committed, you're going to have a tough road to hoe.&lt;br /&gt;
All of the above activities, plus a LOT more internal projects here at work have cut down significantly on my output here at the blog, as well as at the MSDN forums.&amp;nbsp; I'm lucky I was able to keep up some community work by presenting at DevTeach and New York's SQL Saturday.&amp;nbsp;&amp;nbsp;However, I do believe I've gotten on top of managing this change, so things should get closer to the "old normal."&amp;nbsp; Here's hoping the&amp;nbsp;reduced focus&amp;nbsp;I felt I've placed on the community doesn't hurt my chances of getting renewed as a SQL&amp;nbsp;MVP this October too badly.&amp;nbsp; I really do appreciate the opportunity to communicate directly to the&amp;nbsp;product team, and once I get deep into SSIS 2012 and related products, I'm sure I'll be wasting a bunch of their time!&lt;br /&gt;
I still really enjoy writing here, on the forums, and speaking to user groups even though I've been relatively quiet of late.&amp;nbsp; I suppose that if&amp;nbsp;priorities didn't ebb and flow, life would be quite stale.&amp;nbsp; Now that I think I've figured out how to organize myself somewhat, I'll be back at it right here - and hopefully find time to complete version 2 of my BC Ferries app for Windows Phone (and Windows 8) as well.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=yD-ZI221054:m3__StxeQbs:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=yD-ZI221054:m3__StxeQbs:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=yD-ZI221054:m3__StxeQbs: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=yD-ZI221054:m3__StxeQbs: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=yD-ZI221054:m3__StxeQbs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=yD-ZI221054:m3__StxeQbs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/yD-ZI221054" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/6720809433907381013/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/09/the-only-thing-constant-is-change.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6720809433907381013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6720809433907381013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/yD-ZI221054/the-only-thing-constant-is-change.html" title="The Only Thing Constant is Change" /><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/2012/09/the-only-thing-constant-is-change.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANSXg9eip7ImA9WhJQF0k.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-6318708025766836985</id><published>2012-07-31T06:53:00.000-07:00</published><updated>2012-07-31T06:53:18.662-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-31T06:53:18.662-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="OpenXML" /><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="SQLServerPedia Syndication" /><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="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Reading Excel into SSIS via OpenXML Scripting</title><content type="html">Reading Excel data isn't easy.&amp;nbsp; It should be, but there's a lot of unfortunate barriers in the way that I've discussed before.&amp;nbsp; They boil down to one main reason: Excel wasn't created for IT, it was created for business users.&amp;nbsp; We're quite obviously an afterthought.&amp;nbsp; That said, we're much more capable (technically) than business users, so even if the product wasn't designed with us in mind, we do have some options to bend it to our will.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;OpenXML Revealed&lt;/span&gt;&lt;br /&gt;
One of those options is using the OpenXML API.&amp;nbsp; Excel has supported OpenXML since Excel 2007 changed file formats from xls to xlsx.&amp;nbsp; The extra "x" at the end of the file extension refers to the "XML" in OpenXML.&amp;nbsp; The other Office 2007 and later app file formats are similar - they're all OpenXML too.&amp;nbsp; The big secret about these file formats is that they're mostly not binary - they're plain-text XML... but compressed.&amp;nbsp; To see this in action, take any xlsx (or other Office 2007 or later&amp;nbsp;file), and change the file extension to .zip - then open it.&amp;nbsp; Viola, you can now see a whole folder structure with a bunch of xml files in it.&amp;nbsp; Careful what you touch - they're all inter-related.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's the API do?&lt;/span&gt;&lt;br /&gt;
How is the OpenXML API&amp;nbsp;different from the "regular" Excel COM API?&amp;nbsp; In one big way: the COM API actually starts an instance of Excel and talks to it to read and write to Excel files.&amp;nbsp; Instead of doing that, the OpenXML API understands the file formats, and allows you to read and write to the file directly, without knowing how to render, calculate, or otherwise "run" an Excel spreadsheet.&lt;br /&gt;
Of course, I'm not the first one to discover the OpenXML API... there are (of course) the Office-focused geeks that developed it, use it, live it, and breathe it.&amp;nbsp; However, much of what they seem interested in is creating Excel files from applications, rather than consuming them.&amp;nbsp; Documentation and examples of how to read SpreadsheetML (the spreadsheet "flavour" of OpenXML) is pretty damn poor.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;So What's an SSIS Geek To Do?&lt;/span&gt;&lt;br /&gt;
Take matters into their own hands, that's what!&amp;nbsp; I worked on this for a while, because I'm sure I'm not alone in having Excel hold a huge amount of organizational data.&amp;nbsp; This critical information ranges from customer metadata (customer groupings and other attributes) to external economic indicators (housing starts, GDP, ...).&lt;br /&gt;
I've worked up a fairly robust script that reads named columns from a named table in an Excel spreadsheet, and&amp;nbsp;maps them&amp;nbsp;to the columns defined in the script editor.&amp;nbsp; I've developed it such that I can copy and paste the vast majority of the script code - everything except the column mapping.&amp;nbsp; Sooner or later I might turn it into a custom component... but maybe you can do that for me (wink, wink).&lt;br /&gt;
Here's The Code... With Training!&lt;br /&gt;
First, install the OpenXML API.&amp;nbsp; Second, configure your script to output the columns (with data types) you want to read from the Excel table.&amp;nbsp; Third, add a reference to&amp;nbsp;"DocumentFormat.OpenXML" in your Script.&amp;nbsp; Fourth, paste the code (you should probably only paste the contents of the class, not replace the entire class definition - I've included it here so you have context).&amp;nbsp; Last, but not least, modify the first method in the script to set up your column mapping.&lt;br /&gt;
If you want some hands-on training, come to SQLSaturday #158 New York.&amp;nbsp; I've got a session where we'll talk about what makes Excel so hard to use, and why using OpenXML is a pretty good solution.&lt;br /&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: green;"&gt;/* Microsoft SQL Server Integration Services Script Component&lt;br /&gt;*&amp;nbsp;&amp;nbsp;Write scripts using Microsoft Visual C# 2008.&lt;br /&gt;*&amp;nbsp;&amp;nbsp;ScriptMain is the entry point class of the script.*/&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;System&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;System.Collections.Generic&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;System.Data&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;System.Linq&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;Microsoft.SqlServer.Dts.Pipeline.Wrapper&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;Microsoft.SqlServer.Dts.Runtime.Wrapper&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;DocumentFormat.OpenXml.Packaging&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;DocumentFormat.OpenXml.Spreadsheet&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;/span&gt;&lt;span style="color: blue;"&gt;using &lt;/span&gt;&lt;span style="color: black;"&gt;DocumentFormat.OpenXml&lt;/span&gt;&lt;span style="color: grey;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]&lt;/span&gt;&lt;span style="color: blue;"&gt;public class &lt;/span&gt;&lt;span style="color: black;"&gt;ScriptMain &lt;/span&gt;&lt;span style="color: grey;"&gt;: &lt;/span&gt;&lt;span style="color: black;"&gt;UserComponent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Script Setup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;// Ensure you've set up output columns and supplied an Excel Connection Manager in the Script Editor UI&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Set the following variable value to the name of the table in Excel.&amp;nbsp;&amp;nbsp;To find or set the name of the table in Excel,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// go to the Design ribbon in the Table Tools group.&amp;nbsp;&amp;nbsp;The table name is shown on the left side.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private static readonly string &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelTableName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"CompanyDefs"&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: green;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Set this variable to true if you want copious reporting done (for debugging)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private static readonly bool &lt;/span&gt;&lt;span style="color: black;"&gt;VerboseLogging &lt;/span&gt;&lt;span style="color: blue;"&gt;= false&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: green;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Fill this method with calls to MapColumn to map Excel column names to SSIS output columns, and provide data types.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private void &lt;/span&gt;&lt;span style="color: black;"&gt;MapColumns&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;// sample:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// this.MapColumn("Excel Column Header", "SSIS Column Name", typeof(string));&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.MapColumn&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Sample Excel Column"&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;"SSIS Column"&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&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: blue;"&gt;true&lt;/span&gt;&lt;span style="color: grey;"&gt;);&lt;/span&gt;&lt;span style="color: grey;"&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Code You Don't Touch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;// The following code is configured based on the information you supplied in the section above,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// and what columns and connection in the Script Editor UI.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private const string &lt;/span&gt;&lt;span style="color: black;"&gt;SCRIPT_NAME &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"OpenXML API Script Source for SpreadsheetML"&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;private const string &lt;/span&gt;&lt;span style="color: black;"&gt;LAST_UPDATED &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"2012-06-06 23:14"&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;private static bool &lt;/span&gt;&lt;span style="color: black;"&gt;__script_last_updated_logged &lt;/span&gt;&lt;span style="color: blue;"&gt;= false&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;private static &lt;/span&gt;&lt;span style="color: black;"&gt;IDTSComponentMetaData100 __metadata&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: green;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// The list of Excel to SSIS column maps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private readonly &lt;/span&gt;&lt;span style="color: black;"&gt;List&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;_columnMappings &lt;/span&gt;&lt;span style="color: blue;"&gt;= new &lt;/span&gt;&lt;span style="color: black;"&gt;List&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;#region CLASS: ColumnMapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private class &lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping&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;&amp;nbsp;&amp;nbsp;#region Property Setting Delegates&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;public delegate void &lt;/span&gt;&lt;span style="color: black;"&gt;NullSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;isNull&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;public delegate void &lt;/span&gt;&lt;span style="color: black;"&gt;StringSetter&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;value&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;public delegate void &lt;/span&gt;&lt;span style="color: black;"&gt;Int32Setter&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Int32 value&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;public delegate void &lt;/span&gt;&lt;span style="color: black;"&gt;DateTimeSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;DateTime value&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;public delegate void &lt;/span&gt;&lt;span style="color: black;"&gt;BooleanSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;value&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: green;"&gt;//ADD_DATATYPES_HERE&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;Private &lt;/span&gt;&lt;span style="color: black;"&gt;Variables&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;private readonly string &lt;/span&gt;&lt;span style="color: black;"&gt;_excelColumnName&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;private int &lt;/span&gt;&lt;span style="color: black;"&gt;_excelColumnOffset&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;private readonly string &lt;/span&gt;&lt;span style="color: black;"&gt;_ssisColumnName&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;private readonly &lt;/span&gt;&lt;span style="color: black;"&gt;System.Type _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: blue;"&gt;private readonly bool &lt;/span&gt;&lt;span style="color: black;"&gt;_treatBlanksAsNulls&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;#endregion&lt;br /&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;NullSetteer SetNull&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;StringSetter SetString&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;Int32Setter SetInt&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;DateTimeSetter SetDateTime&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;BooleanSetter SetBoolean&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: green;"&gt;//ADD_DATATYPES_HERE&lt;br /&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;#region Constructor&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping&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;excelColumnName&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;ssisColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;System.Type dataType&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;treatBlanksAsNulls&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;excelColumnName&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnOffset &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: black;"&gt;1&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;ssisColumnName&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._treatBlanksAsNulls &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;treatBlanksAsNulls&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;Public &lt;/span&gt;&lt;span style="color: black;"&gt;Properties&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;public &lt;/span&gt;&lt;span style="color: black;"&gt;System.Type DataType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;}&lt;br /&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;public string &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelColumnName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;}&lt;br /&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;public string &lt;/span&gt;&lt;span style="color: black;"&gt;SSISColumnName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;}&lt;br /&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;public int &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelColumnOffset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnOffset&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;&amp;nbsp;&amp;nbsp;set { &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnOffset &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;value&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;}&lt;br /&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;public bool &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelColumnFound&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnOffset &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;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: black;"&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;public bool &lt;/span&gt;&lt;span style="color: black;"&gt;TreatBlanksAsNulls&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;/span&gt;&lt;span style="color: blue;"&gt;return this&lt;/span&gt;&lt;span style="color: black;"&gt;._treatBlanksAsNulls&lt;/span&gt;&lt;span style="color: grey;"&gt;; &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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region SSIS Buffer Setter&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;public void &lt;/span&gt;&lt;span style="color: black;"&gt;SetSSISBuffer&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;value&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;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;String&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&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;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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.SetString&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;value&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered setting SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with string value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;value &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;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Set SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with string value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;value &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;&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;&amp;nbsp;&amp;nbsp;#endregion&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;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;Int&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;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&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;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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;int &lt;/span&gt;&lt;span style="color: black;"&gt;intValue &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;&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;try&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Convert.ToInt32&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;value&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered converting Excel column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;value &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' to integer: " &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;span style="color: blue;"&gt;true&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.SetInt&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;intValue&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered setting SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with int value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;intValue.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;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Set SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with int value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;intValue.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;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: 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;&amp;nbsp;&amp;nbsp;#endregion&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;#region DateTime&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;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;DateTime&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateTime dateValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= new &lt;/span&gt;&lt;span style="color: black;"&gt;DateTime&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;1900&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;1&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;dateValue.AddDays&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Convert.ToDouble&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;value&lt;/span&gt;&lt;span style="color: grey;"&gt;) - &lt;/span&gt;&lt;span style="color: black;"&gt;2&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered converting Excel column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;value &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' to DateTime: " &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;span style="color: blue;"&gt;true&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.SetDateTime&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;dateValue&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered setting SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with DateTime value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;dateValue.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;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Set SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with DateTime value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;dateValue.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"yyyy-MM-dd hh:mm:ss"&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;&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;&amp;nbsp;&amp;nbsp;#endregion&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;#region Boolean&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;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;bool&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;boolValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= false&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;((&lt;/span&gt;&lt;span style="color: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"YES"&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;&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: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"Y"&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;&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: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"TRUE"&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolValue &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&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;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;((&lt;/span&gt;&lt;span style="color: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"NO"&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;&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: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"N"&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;&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: black;"&gt;value.ToUpper&lt;/span&gt;&lt;span style="color: grey;"&gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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: darkred;"&gt;"FALSE"&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= false&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;&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;&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;else&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Invalid boolean value in column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName &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;value &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: blue;"&gt;true&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered converting Excel column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._excelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;value &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' to boolean: " &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;span style="color: blue;"&gt;true&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&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;&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.SetBoolean&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;boolValue&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Error encountered setting SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with boolean value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;boolValue.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;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Set SSIS column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' with Boolean value '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;boolValue.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;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: 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;&amp;nbsp;&amp;nbsp;#endregion&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: green;"&gt;//ADD_DATATYPES_HERE&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;else&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportUnhandledDataTypeError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._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;&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Sets up map from Excel column to an SSIS column&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private void &lt;/span&gt;&lt;span style="color: black;"&gt;MapColumn&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;excelColumnName&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;ssisColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;System.Type dataType&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;treatBlanksAsNulls&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;string &lt;/span&gt;&lt;span style="color: black;"&gt;methodName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"set_" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ssisColumnName.Replace&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: 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: black;"&gt;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Creating " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;dataType.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" mapping from '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;excelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' to '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ssisColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' via " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;methodName&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;ColumnMapping mapping &lt;/span&gt;&lt;span style="color: blue;"&gt;= new &lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;excelColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;ssisColumnName&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;dataType&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;treatBlanksAsNulls&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;#region Code to create delegates I'd have liked to have inside the ColumnMapping class itself if I could pass Output0Buffer...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mapping.SetNull &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: black;"&gt;ColumnMapping.NullSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;Delegate&lt;/span&gt;&lt;span style="color: black;"&gt;.CreateDelegate&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping.NullSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;Output0Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;methodName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"_IsNull"&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&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;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;&amp;nbsp;&amp;nbsp;mapping.SetString &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: black;"&gt;ColumnMapping.StringSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;Delegate&lt;/span&gt;&lt;span style="color: black;"&gt;.CreateDelegate&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping.StringSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;Output0Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;methodName&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&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;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;&amp;nbsp;&amp;nbsp;mapping.SetInt &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: black;"&gt;ColumnMapping.Int32Setter&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;Delegate&lt;/span&gt;&lt;span style="color: black;"&gt;.CreateDelegate&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping.Int32Setter&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;Output0Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;methodName&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;DateTime&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;&amp;nbsp;&amp;nbsp;mapping.SetDateTime &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: black;"&gt;ColumnMapping.DateTimeSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;Delegate&lt;/span&gt;&lt;span style="color: black;"&gt;.CreateDelegate&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping.DateTimeSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;Output0Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;methodName&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;else if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;dataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;bool&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;&amp;nbsp;&amp;nbsp;mapping.SetBoolean &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: black;"&gt;ColumnMapping.BooleanSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: blue;"&gt;Delegate&lt;/span&gt;&lt;span style="color: black;"&gt;.CreateDelegate&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping.BooleanSetter&lt;/span&gt;&lt;span style="color: grey;"&gt;), &lt;/span&gt;&lt;span style="color: black;"&gt;Output0Buffer&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;methodName&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;&lt;/span&gt;&lt;span style="color: green;"&gt;//ADD_DATATYPES_HERE&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;else&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;&amp;nbsp;&amp;nbsp;ReportUnhandledDataTypeError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;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;&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings.Add&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;mapping&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;#endregion&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region CreateNewOutputRows &lt;/span&gt;&lt;span style="color: grey;"&gt;- &lt;/span&gt;&lt;span style="color: black;"&gt;the only method called from SSIS&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;this is &lt;/span&gt;&lt;span style="color: black;"&gt;the &lt;/span&gt;&lt;span style="color: darkred;"&gt;"entry point"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;public override void &lt;/span&gt;&lt;span style="color: black;"&gt;CreateNewOutputRows&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;&amp;nbsp;&amp;nbsp;#region Set up verbose logging&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__metadata &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;ComponentMetaData&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;#endregion&lt;br /&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: green;"&gt;// See http://blogs.msdn.com/b/brian_jones/archive/2008/11/10/reading-data-from-spreadsheetml.aspx&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// http://openxmldeveloper.org/discussions/formats/f/14/p/5029/157797.aspx&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// http://blogs.msdn.com/b/ericwhite/archive/2010/07/21/table-markup-in-open-xml-spreadsheetml.aspx&lt;br /&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;#region Configure Column Mapping&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;this&lt;/span&gt;&lt;span style="color: black;"&gt;.MapColumns&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings.Count &lt;/span&gt;&lt;span style="color: grey;"&gt;!= &lt;/span&gt;&lt;span style="color: black;"&gt;ComponentMetaData.OutputCollection[0].OutputColumnCollection.Count&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;string &lt;/span&gt;&lt;span style="color: black;"&gt;message &lt;/span&gt;&lt;span style="color: blue;"&gt;= this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings.Count.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" column relationships have been set up, but the Script Source has "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ComponentMetaData.OutputCollection[0].OutputColumnCollection.Count.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" output columns defined."&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: black;"&gt;ReportError&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;true&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;throw new &lt;/span&gt;&lt;span style="color: black;"&gt;ArgumentException&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;&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;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings.Count.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" column mappings defined."&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Extract Excel file name from connection manager&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;string &lt;/span&gt;&lt;span style="color: black;"&gt;workbookFileName &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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;SpreadsheetDocument document &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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Extracting Excel file name from connection manager."&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;string &lt;/span&gt;&lt;span style="color: black;"&gt;connectionString &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;ComponentMetaData.RuntimeConnectionCollection[0].ConnectionManager.ConnectionString&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;string&lt;/span&gt;&lt;span style="color: black;"&gt;[] connectionStringParts &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;connectionString.Split&lt;/span&gt;&lt;span style="color: grey;"&gt;(&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &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;connectionStringPart &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;connectionStringParts&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: 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;&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;[] pair &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;connectionStringPart.Split&lt;/span&gt;&lt;span style="color: grey;"&gt;(&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;&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;pair[0] &lt;/span&gt;&lt;span style="color: blue;"&gt;== &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Data Source"&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;workbookFileName &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;pair[1]&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;&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;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"File name of '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;workbookFileName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' identified in connection manager."&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;&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;&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;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch &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;&lt;/span&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;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;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Unable to parse connection string: " &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;span style="color: blue;"&gt;true&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;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Opening Excel file&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;workbookFileName &lt;/span&gt;&lt;span style="color: grey;"&gt;!= &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;&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;try&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Attempting to open Excel file."&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;document &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;SpreadsheetDocument.Open&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;workbookFileName&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;false&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: 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;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch &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;&amp;nbsp;&amp;nbsp;&lt;/span&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;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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&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;workbookFileName &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;ex.Message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&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;}&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;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Excel file opened."&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;#endregion&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;try&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;&amp;nbsp;&amp;nbsp;WorkbookPart workbook &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;document.WorkbookPart&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: black;"&gt;SharedStringTablePart sharedStringTablePart &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;workbook.SharedStringTablePart&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: black;"&gt;#region Unused code &lt;/span&gt;&lt;span style="color: blue;"&gt;for &lt;/span&gt;&lt;span style="color: black;"&gt;finding ranges&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: green;"&gt;//ComponentMetaData.FireInformation(0, "", "Got WorkbookPart", "", 0, ref 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;&amp;nbsp;//#region Look at Ranges&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;//bool foundRange = false;&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;//RangeDef rangeDef = new RangeDef();&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;//foreach (DefinedName name in workbook.Workbook.GetFirstChild&amp;lt;DefinedNames&amp;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;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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "", "Looking at defined name '" + name.Name + "'", "", 0, ref 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;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (name.Name == this._rangeName)&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;//&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "", "Saving def", "", 0, ref 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;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.Name = name.Name;&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string reference = name.InnerText;&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "", "&amp;nbsp;&amp;nbsp;reference: " + reference, "", 0, ref 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;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.Sheet = reference.Split('!')[0].Trim('\'');&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] rangeArray = reference.Split('!')[1].Split('$');&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.StartCol = rangeArray[1];&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.StartRow = rangeArray[2].TrimEnd(':');&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.EndCol = rangeArray[3];&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rangeDef.EndRow = rangeArray[4];&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundRange = true;&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&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;//&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//ComponentMetaData.FireInformation(0, "", "Done looking for defined names", "", 0, ref 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;&amp;nbsp;//if (foundRange)&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;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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string rangeID = workbook.Workbook.Descendants&amp;lt;Sheet&amp;gt;().Where(r =&amp;gt; r.Name.Equals(rangeDef.Sheet)).First().Id;&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "", "Got rangeID " + rangeID, "", 0, ref 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;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WorksheetPart range = (WorksheetPart)workbook.GetPartById(rangeID);&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;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComponentMetaData.FireInformation(0, "", "Got Range", "", 0, ref 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;&amp;nbsp;//}&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;//#endregion&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: black;"&gt;#endregion&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;#region Iterate over sheets to find table&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;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Searching sheets for table '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelTableName &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Table table &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Worksheet worksheet &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Sheet sheet &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;workbook.Workbook.Sheets&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Examining sheet '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;sheet.Name &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;&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;WorksheetPart worksheetPart &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: black;"&gt;WorksheetPart&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;document.WorkbookPart.GetPartById&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;sheet.Id&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;TableDefinitionPart tableDefinitionPart &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;worksheetPart.TableDefinitionParts&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Sheet contains table '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;tableDefinitionPart.Table.DisplayName &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;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;tableDefinitionPart.Table.DisplayName &lt;/span&gt;&lt;span style="color: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelTableName&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;worksheet &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;worksheetPart.Worksheet&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;&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: black;"&gt;table &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;tableDefinitionPart.Table&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;&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: black;"&gt;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Sheet and table found."&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;&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;&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: 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;&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;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;table &lt;/span&gt;&lt;span style="color: grey;"&gt;!= &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;&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;{&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;&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;&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;&amp;nbsp;&amp;nbsp;}&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;#endregion&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;table &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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Table '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelTableName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' wasn't found in '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;workbookFileName &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: blue;"&gt;true&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: 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;&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;&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;&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;firstColumnHeader &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;#region Find Excel Column Offsets&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Collecting column offsets for mapped columns."&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;1&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;TableColumn tableColumn &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;table.TableColumns&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;&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;&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;if &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: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;firstColumnHeader &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;tableColumn.Name&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;&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;&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;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping columnRelationship &lt;/span&gt;&lt;span style="color: blue;"&gt;in this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings&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;&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;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;tableColumn.Name &lt;/span&gt;&lt;span style="color: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.ExcelColumnName&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;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Found Excel column " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;tableColumn.Name &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;" at offset " &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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: black;"&gt;columnRelationship.ExcelColumnOffset &lt;/span&gt;&lt;span style="color: blue;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;Throw &lt;/span&gt;&lt;span style="color: black;"&gt;an error &lt;/span&gt;&lt;span style="color: blue;"&gt;if &lt;/span&gt;&lt;span style="color: black;"&gt;not all columns were found&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping columnRelationship &lt;/span&gt;&lt;span style="color: blue;"&gt;in this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings&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;&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;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(!&lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.ExcelColumnFound&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;&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;&amp;nbsp;&amp;nbsp;&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;string &lt;/span&gt;&lt;span style="color: black;"&gt;message &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Unable to locate column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.ExcelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' in table '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;ExcelTableName &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: black;"&gt;ReportError&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;true&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Read spreadsheet data into SSIS output buffer&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SheetData sheetData &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;worksheet.GetFirstChild&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;SheetData&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;Row&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;rows &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;sheetData.Elements&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;Row&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;#region Find First Row&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 firstRow &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;&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;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Finding first row of table."&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Row row &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;rows&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;&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;&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;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Cell cell &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;row.Elements&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;Cell&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;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;&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;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.CellReferenceToCoordinates&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cell.CellReference&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: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.GetCellValue&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cell&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;sharedStringTablePart&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;firstColumnHeader&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;firstRow &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;row.RowIndex &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&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;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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"First row of table is on row " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;firstRow.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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;#endregion&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Preparing to read " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;rows.Count&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;Row&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;()&lt;/span&gt;&lt;span style="color: black;"&gt;.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" table rows from Excel."&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Row row &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;rows&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Reading row " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;row.RowIndex.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;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;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;row.RowIndex &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: black;"&gt;firstRow&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Skipping non-table or header row."&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;&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;&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;else&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Reading data row " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ (&lt;/span&gt;&lt;span style="color: black;"&gt;row.RowIndex &lt;/span&gt;&lt;span style="color: grey;"&gt;- &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;/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;&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;bool &lt;/span&gt;&lt;span style="color: black;"&gt;rowAdded &lt;/span&gt;&lt;span style="color: blue;"&gt;= false&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;&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;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Cell cell &lt;/span&gt;&lt;span style="color: blue;"&gt;in &lt;/span&gt;&lt;span style="color: black;"&gt;row.Elements&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: black;"&gt;Cell&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;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;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;foreach &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;ColumnMapping columnRelationship &lt;/span&gt;&lt;span style="color: blue;"&gt;in this&lt;/span&gt;&lt;span style="color: black;"&gt;._columnMappings&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.CellReferenceToCoordinates&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cell.CellReference&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: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.ExcelColumnOffset&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;string &lt;/span&gt;&lt;span style="color: black;"&gt;cellValue &lt;/span&gt;&lt;span style="color: blue;"&gt;= this&lt;/span&gt;&lt;span style="color: black;"&gt;.GetCellValue&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cell&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;sharedStringTablePart&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;((&lt;/span&gt;&lt;span style="color: black;"&gt;cellValue &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: black;"&gt;cellValue &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;) &amp;amp;&lt;/span&gt;&lt;span style="color: black;"&gt;amp&lt;/span&gt;&lt;span style="color: grey;"&gt;;&amp;amp;&lt;/span&gt;&lt;span style="color: black;"&gt;amp&lt;/span&gt;&lt;span style="color: grey;"&gt;; &lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.TreatBlanksAsNulls&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: green;"&gt;// do nothing&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;else&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(!&lt;/span&gt;&lt;span style="color: black;"&gt;rowAdded&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output0Buffer.AddRow&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: black;"&gt;rowAdded &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Excel column '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;columnRelationship.ExcelColumnName &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;"' contains '" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;cellValue &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: black;"&gt;columnRelationship.SetSSISBuffer&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.GetCellValue&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cell&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;sharedStringTablePart&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;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;&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;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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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;br /&gt;&amp;nbsp;&amp;nbsp;&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;#region &lt;/span&gt;&lt;span style="color: blue;"&gt;catch &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;&lt;/span&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;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;&amp;nbsp;&amp;nbsp;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Unable to open Excel file using OpenXML API: " &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;span style="color: blue;"&gt;true&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;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VerboseLog&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"Closing Excel file"&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;document.Close&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Helper functions to change Excel ranges to numeric coordinates&lt;/span&gt;&lt;span style="color: grey;"&gt;/&lt;/span&gt;&lt;span style="color: black;"&gt;offsets&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private int&lt;/span&gt;&lt;span style="color: black;"&gt;[] RangeReferenceToCoordinates&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;rangeReference&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;[] coordinates &lt;/span&gt;&lt;span style="color: blue;"&gt;= new int&lt;/span&gt;&lt;span style="color: black;"&gt;[4]&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt;[] cellReferences &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;rangeReference.Split&lt;/span&gt;&lt;span style="color: grey;"&gt;(&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;[] startCellReference &lt;/span&gt;&lt;span style="color: blue;"&gt;= this&lt;/span&gt;&lt;span style="color: black;"&gt;.CellReferenceToCoordinates&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cellReferences[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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;[] endCellReference &lt;/span&gt;&lt;span style="color: blue;"&gt;= this&lt;/span&gt;&lt;span style="color: black;"&gt;.CellReferenceToCoordinates&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cellReferences[1]&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;&lt;/span&gt;&lt;span style="color: black;"&gt;coordinates[0] &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;startCellReference[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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;coordinates[1] &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;startCellReference[1]&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;coordinates[2] &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;endCellReference[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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;coordinates[3] &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;endCellReference[1]&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;&lt;/span&gt;&lt;span style="color: blue;"&gt;return &lt;/span&gt;&lt;span style="color: black;"&gt;coordinates&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private int&lt;/span&gt;&lt;span style="color: black;"&gt;[] CellReferenceToCoordinates&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;cellReference&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;//bool fireAgain = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;t[] coordinates &lt;/span&gt;&lt;span style="color: blue;"&gt;= new int&lt;/span&gt;&lt;span style="color: black;"&gt;[2]&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;&lt;/span&gt;&lt;span style="color: green;"&gt;//ComponentMetaData.FireInformation(0, "", "CellRef: [" + cellReference + "]", "", 0, ref fireAgain);&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;int &lt;/span&gt;&lt;span style="color: black;"&gt;index&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;cellReference &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;cellReference.Replace&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: darkred;"&gt;""&lt;/span&gt;&lt;span style="color: grey;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;.Trim&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;#region Collect column letters &lt;/span&gt;&lt;span style="color: grey;"&gt;-&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;column&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;string &lt;/span&gt;&lt;span style="color: black;"&gt;column &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;&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: black;"&gt;index &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;/span&gt;&lt;span style="color: black;"&gt;index &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: black;"&gt;cellReference.Length&lt;/span&gt;&lt;span style="color: grey;"&gt;; &lt;/span&gt;&lt;span style="color: black;"&gt;index&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;&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: darkred;"&gt;"ABCDEFGHIJKLMNOPQRSTUVWXYZ"&lt;/span&gt;&lt;span style="color: black;"&gt;.Contains&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cellReference[index]&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: 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;column &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;cellReference[index]&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: 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;&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;&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;&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;&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&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: green;"&gt;//ComponentMetaData.FireInformation(0, "", "column: [" + column + "]", "", 0, ref fireAgain);&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;#region Convert column into number &lt;/span&gt;&lt;span style="color: grey;"&gt;-&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;coordinates[0]&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;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;power &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;/span&gt;&lt;span style="color: black;"&gt;power &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: black;"&gt;index&lt;/span&gt;&lt;span style="color: grey;"&gt;; &lt;/span&gt;&lt;span style="color: black;"&gt;power&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;&amp;nbsp;&amp;nbsp;coordinates[0] &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: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"ABCDEFGHIJKLMNOPQRSTUVWXYZ"&lt;/span&gt;&lt;span style="color: black;"&gt;.IndexOf&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;column[column.Length - power - 1]&lt;/span&gt;&lt;span style="color: grey;"&gt;) + &lt;/span&gt;&lt;span style="color: black;"&gt;1&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;Math.Pow&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;26&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;power&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;#endregion&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: green;"&gt;//ComponentMetaData.FireInformation(0, "", "col coords: [" + coordinates[0].ToString() + "]", "", 0, ref fireAgain);&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;#region Convert row into number &lt;/span&gt;&lt;span style="color: grey;"&gt;-&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;coordinates[1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coordinates[1] &lt;/span&gt;&lt;span style="color: blue;"&gt;= &lt;/span&gt;&lt;span style="color: black;"&gt;Convert.ToInt32&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;cellReference.Substring&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;index&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;#endregion&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: green;"&gt;//ComponentMetaData.FireInformation(0, "", "row coords: [" + coordinates[1].ToString() + "]", "", 0, ref fireAgain);&lt;br /&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;return &lt;/span&gt;&lt;span style="color: black;"&gt;coordinates&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;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Helper function to read Excel cell values&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private string &lt;/span&gt;&lt;span style="color: black;"&gt;GetCellValue&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;Cell cell&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: black;"&gt;SharedStringTablePart sharedStringTablePart&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;&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;cell.ChildElements.Count &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;&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;return 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;&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;&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;cell.DataType &lt;/span&gt;&lt;span style="color: grey;"&gt;!= &lt;/span&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;span style="color: grey;"&gt;) &amp;amp;&lt;/span&gt;&lt;span style="color: black;"&gt;amp&lt;/span&gt;&lt;span style="color: grey;"&gt;;&amp;amp;&lt;/span&gt;&lt;span style="color: black;"&gt;amp&lt;/span&gt;&lt;span style="color: grey;"&gt;; (&lt;/span&gt;&lt;span style="color: black;"&gt;cell.DataType &lt;/span&gt;&lt;span style="color: blue;"&gt;== &lt;/span&gt;&lt;span style="color: black;"&gt;CellValues.SharedString&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;return &lt;/span&gt;&lt;span style="color: black;"&gt;sharedStringTablePart.SharedStringTable.ChildElements[Int32.Parse(cell.CellValue.InnerText)].InnerText&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;&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;&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;return &lt;/span&gt;&lt;span style="color: black;"&gt;cell.CellValue.InnerText&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Logging functions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private static void &lt;/span&gt;&lt;span style="color: black;"&gt;VerboseLog&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;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: black;"&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;bool &lt;/span&gt;&lt;span style="color: black;"&gt;pbFireAgain &lt;/span&gt;&lt;span style="color: blue;"&gt;= true&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;&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;__script_last_updated_logged&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;&amp;nbsp;&amp;nbsp;__metadata.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: black;"&gt;__metadata.Name&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: darkred;"&gt;"Excel OpenXML API Source Script (" &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;LAST_UPDATED &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;") running."&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;span style="color: blue;"&gt;ref &lt;/span&gt;&lt;span style="color: black;"&gt;pbFireAgain&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: black;"&gt;__script_last_updated_logged &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;&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;&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;VerboseLogging&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;&amp;nbsp;&amp;nbsp;__metadata.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: black;"&gt;__metadata.Name&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: 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;pbFireAgain&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private static void &lt;/span&gt;&lt;span style="color: black;"&gt;ReportError&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;message&lt;/span&gt;&lt;span style="color: grey;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;fatal&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;bool &lt;/span&gt;&lt;span style="color: black;"&gt;pbCancel&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;__metadata.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: black;"&gt;__metadata.Name&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: 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: black;"&gt;out pbCancel&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;if &lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;fatal&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;throw new &lt;/span&gt;&lt;span style="color: black;"&gt;ApplicationException&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;SCRIPT_NAME &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: darkred;"&gt;" had a fatal error."&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;private static void &lt;/span&gt;&lt;span style="color: black;"&gt;ReportUnhandledDataTypeError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;System.Type dataType&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;// Need to add a Data Type?&amp;nbsp;&amp;nbsp;Search for ADD_DATATYPES_HERE&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;ReportError&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"This script can't handle " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;dataType.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" types."&lt;/span&gt;&lt;span style="color: grey;"&gt;, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;throw new &lt;/span&gt;&lt;span style="color: black;"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: grey;"&gt;(&lt;/span&gt;&lt;span style="color: darkred;"&gt;"This script can't handle " &lt;/span&gt;&lt;span style="color: grey;"&gt;+ &lt;/span&gt;&lt;span style="color: black;"&gt;dataType.ToString&lt;/span&gt;&lt;span style="color: grey;"&gt;() + &lt;/span&gt;&lt;span style="color: darkred;"&gt;" types."&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;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gkmAywNBuDA:Y-qHnizXE9c:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=gkmAywNBuDA:Y-qHnizXE9c:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=gkmAywNBuDA:Y-qHnizXE9c: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=gkmAywNBuDA:Y-qHnizXE9c: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=gkmAywNBuDA:Y-qHnizXE9c:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=gkmAywNBuDA:Y-qHnizXE9c:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/gkmAywNBuDA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/6318708025766836985/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/07/reading-excel-into-ssis-via-openxml.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6318708025766836985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6318708025766836985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/gkmAywNBuDA/reading-excel-into-ssis-via-openxml.html" title="Reading Excel into SSIS via OpenXML Scripting" /><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>6</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2012/07/reading-excel-into-ssis-via-openxml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFQXwycSp7ImA9WhVbEkQ.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8099618818118975485</id><published>2012-05-29T06:00:00.000-07:00</published><updated>2012-05-29T06:00:10.299-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-29T06:00:10.299-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Presenting at Vancouver DevTeach</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://public.sn2.livefilestore.com/y1pQ5EcEfhd4SZo0eXLe7r9U0ToRESejj0Q0iKtAmSoZi9HKImilfA3a_AlZgzUJumou7zvO-uqH1MenGVfq_EFEA/DevTeach%20Banner.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/y1pQ5EcEfhd4SZo0eXLe7r9U0ToRESejj0Q0iKtAmSoZi9HKImilfA3a_AlZgzUJumou7zvO-uqH1MenGVfq_EFEA/DevTeach%20Banner.jpg?download&amp;amp;psid=1" /&gt;&lt;/a&gt;This post should have been made a couple months ago so that my legions of rabid fans could have lined up to... yeah, OK - I'm not fooling anybody, I know.&amp;nbsp; But for those that &lt;strong&gt;are&lt;/strong&gt; signed up to DevTeach in Vancouver, you should definitely put my sessions in your schedule.&amp;nbsp; I mean, if you read my blog, I know you're interested in Integration Services, and that's what I'll be talking about.&lt;/div&gt;
I'll give you the first day to get warmed up to the conference experience.&amp;nbsp; I'll be hanging around from midday onwards, picking up a few sessions and hanging around in between poking at my computer.&amp;nbsp; &lt;br /&gt;
But first thing on the second day, come bright-eyed and bushy-tailed to hear some good solutions for common application pattern problems in SSIS.&amp;nbsp; I mentioned in the abstract that we'll look at processing files in date order, and upsert patterns.&amp;nbsp; I've got five other topics I can cover - flat files with headers and footers,&amp;nbsp;deduplicating data, emailing resultsets, calculating running totals, inserting parent/child rows, and zipping files.&amp;nbsp; The good part is that the audience decides what we spend our time on!&amp;nbsp; If nobody there cares about some of those topics, we don't have to waste time listening to it.&lt;br /&gt;
On the third conference day, if you touch Excel spreadsheets with Integration Services, you can't miss my afternoon session.&amp;nbsp; Scratch that - if you use SSIS, you obviously have spreadsheets as a source.&amp;nbsp; Be there.&amp;nbsp; There aren't any foolproof techniques, but there's a great big bag of excellent ones that should get you through the minefield of Excel flexibility and user inconsistency.&amp;nbsp; The big reveal will be a sample of using OpenXML to read data from a spreadsheet.&amp;nbsp; I don't think I'm a fan of OpenXML yet - but it'll be hard to resist if it continues to work this well.&amp;nbsp; (I'll be blogging about that soon.)&lt;br /&gt;
DevTeach is a very cozy and informal conference - I have no doubt that those of you who are attending will love it.&amp;nbsp; Don't hesitate to take advantage of that environment - the speakers are all willing to sit down with you about any topic.&amp;nbsp; I know I am, so if you have an interesting SSIS problem, or just want to moan about the weather, post a comment here, or mail me at &amp;lt;myfullnamewithnospaces&amp;gt;@live.ca.&amp;nbsp; Look forward to seeing you all there.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=iTLwCGTM5qg:74IbOPA6sm4:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=iTLwCGTM5qg:74IbOPA6sm4:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=iTLwCGTM5qg:74IbOPA6sm4: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=iTLwCGTM5qg:74IbOPA6sm4: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=iTLwCGTM5qg:74IbOPA6sm4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=iTLwCGTM5qg:74IbOPA6sm4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/iTLwCGTM5qg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8099618818118975485/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/05/presenting-at-vancouver-devteach.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8099618818118975485?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8099618818118975485?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/iTLwCGTM5qg/presenting-at-vancouver-devteach.html" title="Presenting at Vancouver DevTeach" /><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/2012/05/presenting-at-vancouver-devteach.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ESX05eip7ImA9WhVbEEg.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-2471929674779694068</id><published>2012-05-22T05:00:00.000-07:00</published><updated>2012-05-26T09:46:48.322-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T09:46:48.322-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Derived Column Transformation" /><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>Basic SSIS Equivalents to T-SQL's LIKE</title><content type="html">There are some things that we do in one SQL Server tool, but can't seem to figure out how to do in another.&amp;nbsp; One of those for you might be the &lt;a href="http://msdn.microsoft.com/en-us/library/ms179859.aspx"&gt;LIKE keyword&lt;/a&gt; in T-SQL.&amp;nbsp; LIKE is fairly powerful in T-SQL - it does&amp;nbsp;rudimentary regular&amp;nbsp;expressions.&amp;nbsp;&amp;nbsp;How do you do that in SSIS?&amp;nbsp; Well, you can't get too fancy, but here are&amp;nbsp;some basics.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Columns That Contain a Value&lt;/span&gt;&lt;br /&gt;
This applies to cases where your T-SQL query might include a clause&amp;nbsp;like this:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;col LIKE '%value%'&lt;/span&gt;&lt;/blockquote&gt;
The SSIS expression equivalent involves the function &lt;a href="http://msdn.microsoft.com/en-us/library/ms141748.aspx"&gt;FINDSTRING&lt;/a&gt;.&amp;nbsp; FINDSTRING looks in any string expression (including a column) for an occurrence of a particular substring, and which occurrence to look for.&lt;br /&gt;
The equivalent expression in SSIS to the example above is:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;FINDSTRING(col, "value", 1) &amp;gt; 0&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Columns That Start With a Value&lt;/span&gt;&lt;br /&gt;
This applies to cases where your T-SQL query might include a clause like this (where X is a number):&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;col LIKE 'value%'&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;LEFT(col, X) = 'value'&lt;/span&gt;&lt;/blockquote&gt;
This is a fairly rudimentary case - and there are multiple methods for developing an equivalent SSIS expression with FINDSTRING, or &lt;a href="http://msdn.microsoft.com/en-us/library/hh231081.aspx"&gt;LEFT&lt;/a&gt;, such as:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;FINDSTRING(col, "value", 1) == 1&lt;/span&gt;&lt;/blockquote&gt;
or&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;LEFT(col, X) == "value"&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Columns That End With a Value&lt;/span&gt;&lt;br /&gt;
This one's a little trickier (in SSIS2008R2 and below), and has&amp;nbsp;prompted a&amp;nbsp;few questions on the &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/threads"&gt;MSDN SSIS forums&lt;/a&gt;.&amp;nbsp; The T-SQL case would look something like:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;RIGHT(col, X) = 'value'&lt;/span&gt;&lt;/blockquote&gt;
There's a LEFT in SSIS' expression language... but no RIGHT prior to SSIS 2012, so what can you do?&amp;nbsp; How about using REVERSE and LEFT, like this:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;REVERSE(LEFT(REVERSE(col), X))&amp;nbsp; == "value"&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;More Complicated Demands?&lt;/span&gt;&lt;br /&gt;
T-SQL's LIKE can service more complicated pattern searching - look for future posts where I'll try to investigate some.&amp;nbsp; If you have any particular requests, post a comment...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=3dPup3TsoiM:vHkuOwv8zlA:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=3dPup3TsoiM:vHkuOwv8zlA:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=3dPup3TsoiM:vHkuOwv8zlA: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=3dPup3TsoiM:vHkuOwv8zlA: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=3dPup3TsoiM:vHkuOwv8zlA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=3dPup3TsoiM:vHkuOwv8zlA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/3dPup3TsoiM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/2471929674779694068/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/05/basic-ssis-equivalents-to-t-sqls-like.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2471929674779694068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/2471929674779694068?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/3dPup3TsoiM/basic-ssis-equivalents-to-t-sqls-like.html" title="Basic SSIS Equivalents to T-SQL's LIKE" /><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>3</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2012/05/basic-ssis-equivalents-to-t-sqls-like.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8FQnc9cCp7ImA9WhVVGUQ.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-6174052732924108346</id><published>2012-05-14T05:00:00.000-07:00</published><updated>2012-05-14T05:00:13.968-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-14T05:00:13.968-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><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="Integration Services (SSIS)" /><title>The Effective Permissions Tool is Handy</title><content type="html">An recurring issue with Integration Services packages that read or write to file systems is permissions issues.&amp;nbsp; It's quite difficult to have a package run properly when it can't see the source files, or can't write results to a particular network share.&amp;nbsp; But it's insanely hard to get a package working if you don't think permissions are set up properly but your sysadmins do.&amp;nbsp; I'll rehash what many of you already know (the typical problem and typical solution) in order to provide some background, then I'll call out a tool I've used when that just doesn't work... and you need to &lt;em&gt;persuade&lt;/em&gt; your sysadmins to look a little harder.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;SQL Agent Jobs Fail...&lt;/span&gt;&lt;br /&gt;
These errors typically surface when the job is put into production as a SQL Agent Job Step, where it's executing under an account you didn't develop it with.&amp;nbsp; You'll typically get an error in the job history that looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Executed as user: DOMAIN\MACHINE$. Microsoft (R) SQL Server Execute Package Utility&amp;nbsp; Version 10.0.5500.0 for 64-bit&amp;nbsp; Copyright (C) Microsoft Corp 1984-2005. All rights reserved.&amp;nbsp;&amp;nbsp;&amp;nbsp; Started:&amp;nbsp; 3:42:58 PM&amp;nbsp; Error: 2012-05-07 15:42:58.76&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Code: 0xC001401E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: Flat File Read Connection manager "Test"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description: The file name "\\Share\Folder\Testing.txt" specified in the connection was not valid.&amp;nbsp; End Error&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Your first reaction is "I can see that file - of course it's there!"&lt;br /&gt;
It's not hard to overlook the fact that the account the job is executing under is the SQL Agent account - not yours, and it needs the same permissions your account did in order to do&amp;nbsp;this job.&amp;nbsp; (Well - hopefully not exactly the same permissions - just those few that are absolutely necessary.)&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;... Because They Don't Have Permission ...&lt;/span&gt;&lt;br /&gt;
You can see that in the first part of the message - "Executed as user:"&amp;nbsp; (I've replaced real data with fake names to protect the innocent.)&amp;nbsp; The message tells me that the job is executing under a system account (my fictitious computer is named "machine").&amp;nbsp; The folder "Folder" on the network share "Share" doesn't permit that account access, so the job fails.&lt;br /&gt;
You have a few options to deal with this - some are better than others:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;You can grant access to \\Share\Folder to DOMAIN\MACHINE.&lt;/li&gt;
&lt;li&gt;You can create a Proxy to execute the package with your account credentials (since you have permissions).&lt;/li&gt;
&lt;li&gt;You can create a new domain account specifically for this purpose, grant it appropriate rights to the network share, create a Proxy for it, then configure the job to use that Proxy.&lt;/li&gt;
&lt;/ol&gt;
I always choose (3).&amp;nbsp; No, I don't ask our sysadmins to create a new account for every Agent job.&amp;nbsp; I create "service accounts" that I can use to manage distinct "systems."&amp;nbsp; I've got one that handles ETL work for my data warehouse.&amp;nbsp; I've got another that handles some import work for a third-party system.&amp;nbsp; Each of them is used in a few places, but the key is that their permissions are very low (no interactive login, etc) and they only get rights as necessary to complete their tasks.&lt;br /&gt;
However you do it, managing proxies usually gets you to your goal... until it doesn't.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;... Even After They Should!?&lt;/span&gt;&lt;br /&gt;
I've run into scenarios where I'd swear a certain account ought to have access to a resource, and yet it doesn't seem to.&amp;nbsp; In the case of file systems there's one particular tool that has saved my addled brain a couple times.&amp;nbsp; After all, computers are dumb machines (no offense intended) and only do what we've told them to do.&amp;nbsp; So if they're refusing access... it must be because we've instructed them to do so.&lt;br /&gt;
Given that we've narrowed the problem down to our own inability to configure security, we need to confirm that diagnosis, and possibly figure out why.&amp;nbsp;&amp;nbsp;The tool I'm talking about is&amp;nbsp;the Effective Permissions tab of the security settings dialog.&amp;nbsp; To get there, find the file system location or object you're trying to access and open its properties.&amp;nbsp; Switch to the security tab (which you &lt;strong&gt;swear&lt;/strong&gt; shows what it should).&amp;nbsp; Hit the Advanced button.&amp;nbsp; This (permissions) view alone may highlight the mistake you've made - you may think certain accounts inherit things in a certain manner, but don't.&amp;nbsp; You may think certain permissions apply further down the folder tree, but don't.&lt;br /&gt;
In case you're still not enlightened as to why things aren't working, and need proof one way or the other that permissions really are the issue, click over to the Effective Permissions tab.&amp;nbsp; Type or select the account your proxy is configured for, and you'll see exactly how the operating system resolves the permissions.&amp;nbsp; &lt;br /&gt;
If you set up the security settings, I hope this cuts down on the possible problems and highlights just a few.&amp;nbsp; If you've asked someone else to set up permissions, this tool should show you whether the job was done correctly or not.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=rUYHxpMsF0o:MFLQsO1Br98:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=rUYHxpMsF0o:MFLQsO1Br98:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=rUYHxpMsF0o:MFLQsO1Br98: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=rUYHxpMsF0o:MFLQsO1Br98: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=rUYHxpMsF0o:MFLQsO1Br98:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=rUYHxpMsF0o:MFLQsO1Br98:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/rUYHxpMsF0o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/6174052732924108346/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/05/effective-permissions-tool-is-handy.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6174052732924108346?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/6174052732924108346?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/rUYHxpMsF0o/effective-permissions-tool-is-handy.html" title="The Effective Permissions Tool is Handy" /><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/2012/05/effective-permissions-tool-is-handy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMERH46fip7ImA9WhVVFEo.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-3315865663871911487</id><published>2012-05-08T05:00:00.000-07:00</published><updated>2012-05-08T05:00:05.016-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-08T05:00:05.016-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Derived Column Transformation" /><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 T-SQL TIMESTAMP (ROWVERSION) in SSIS</title><content type="html">In some database designs, you may encounter SQL Server columns with a TIMESTAMP or ROWVERSION data type.&amp;nbsp; What are these, and how do you deal with them in SQL Server Integration&amp;nbsp; Services?&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Time?&amp;nbsp; Version?&lt;/span&gt;&lt;br /&gt;
First, let's talk semantics.&amp;nbsp; There are&amp;nbsp;several unfortunately bad aspects to these names. First, the name "TIMESTAMP" is deprecated - newer versions of SQL Server use the name ROWVERSION instead.&amp;nbsp; I can imagine that there was&amp;nbsp;confusion that the data type somehow represented an actual time value (it does not), or matched the ISO standard definiton of a TIMESTAMP data type (it does not).&amp;nbsp; Unfortunately the ROWVERSION name doesn't describe it that well to me either, as there is no relation to the primary key, or how &lt;em&gt;many&lt;/em&gt; updates have been made to a particular row.&lt;br /&gt;
A better description would probably be to call the data type SEQUENCE... but &lt;a href="http://msdn.microsoft.com/en-us/library/ff878091.aspx"&gt;that's already a keyword &lt;/a&gt;used for another construct in SQL Server.&amp;nbsp; A column with a TIMESTAMP or ROWVERSION data type is an auto-incrementing, unique value for the entire database.&amp;nbsp; (Perhaps it's implemented internally as a &lt;a href="http://msdn.microsoft.com/en-us/library/ff878091.aspx"&gt;SEQUENCE&lt;/a&gt;... ;) )&amp;nbsp; Another wrinkle is that this column gets updated whenever any data in the row is changed by an UPDATE.&amp;nbsp; So it's almost like an IDENTITY column for inserts and updates.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's it Used For?&lt;/span&gt;&lt;br /&gt;
As highlighted in the opening of the MSDN page for ROWVERSION, this data type is (allegedly) typically used to version-stamp table rows.&amp;nbsp; In my (limited) experience, it can be equally (mis)used similarly to a GUID column - a unique identifier for a row in a table, or a hash-like "has this been modified" value.&lt;br /&gt;
However it's used in the construction of the table, it usually enters into the Integration Services world as a column you have to compare against another table's column - typically to detect changes.&lt;br /&gt;
Some database developers may take advantage of the documented (but not guaranteed in my reading) "incrementing" behaviour, and use it to help determine which row is the newest when comparing two rows.&lt;br /&gt;
Careful reading of the MSDN page also shows that &lt;strong&gt;duplicate rowversion values&lt;/strong&gt; are possible if SELECT INTO statements are used improperly.&amp;nbsp; Something to watch out for there.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;How Does it Appear to SSIS?&lt;/span&gt;&lt;br /&gt;
When you extract data from a table that has a ROWVERSION column, SSIS will see it as a DT_BYTES column of 8 bytes.&amp;nbsp; This makes sense, as the MSDN page describes it as semantically equivalent to a &lt;span&gt;&lt;span class="input"&gt;binary(8) or varbinary(8).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span class="input"&gt;Since it's a byte stream, that greatly limits what you'll be able to do with this data in SSIS - but then, the intent of this data type isn't to contain any more data than some kind of version stamp.&amp;nbsp; Your most likely action inside SSIS is to compare this value with the value from another table to see if they're different...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span class="input"&gt;&lt;span style="color: #e69138; font-size: large;"&gt;Performing Comparisons&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span class="input"&gt;If you try the straightforward comparison in a Conditional Split or Derived Column... you'll get a syntax error.&amp;nbsp; Despite &lt;a href="http://msdn.microsoft.com/en-us/library/ms141714.aspx"&gt;claims to the contrary&lt;/a&gt;, SSIS can't use any comparison operators on DT_BYTES columns.&amp;nbsp; (Except the ISNULL function.)&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/y1poKoV3pVfr3NV-uKZwsJF_KCaFblkFUsOdurhrgiPQuLBByBMxSmGGXoCeFpNIhLg_tzEOYwC_C1Az-y1ns63VQ/DT_BYTES%20comparison%20syntax%20error.jpg?psid=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="https://public.sn2.livefilestore.com/y1poKoV3pVfr3NV-uKZwsJF_KCaFblkFUsOdurhrgiPQuLBByBMxSmGGXoCeFpNIhLg_tzEOYwC_C1Az-y1ns63VQ/DT_BYTES%20comparison%20syntax%20error.jpg?psid=1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
What to do?&amp;nbsp; Convert the DT_BYTES to a data type that SSIS can compare - DT_WSTR.&amp;nbsp; There's a tricky spot here though - you can't convert the DT_BYTES(8) to a DT_WSTR(8).&amp;nbsp; The conversion code sometimes generates more character bytes - so double the space to a DT_WSTR(16), &lt;span&gt;&lt;span class="input"&gt;and you should be off to the races.&lt;/span&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=J7OpUZHMJI4:xVRta5yaSa8:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=J7OpUZHMJI4:xVRta5yaSa8:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=J7OpUZHMJI4:xVRta5yaSa8: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=J7OpUZHMJI4:xVRta5yaSa8: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=J7OpUZHMJI4:xVRta5yaSa8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=J7OpUZHMJI4:xVRta5yaSa8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/J7OpUZHMJI4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/3315865663871911487/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/05/how-to-use-t-sql-timestamp-rowversion.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3315865663871911487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/3315865663871911487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/J7OpUZHMJI4/how-to-use-t-sql-timestamp-rowversion.html" title="How To Use T-SQL TIMESTAMP (ROWVERSION) 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>2</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2012/05/how-to-use-t-sql-timestamp-rowversion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMNRng-eyp7ImA9WhVXE04.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-8765728557985241076</id><published>2012-04-09T05:30:00.000-07:00</published><updated>2012-04-13T10:34:57.653-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-13T10:34:57.653-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="Microsoft Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="Quick Reference" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Quick Reference: How Do I Read an Excel XSLM (Macro-Enabled) File in SSIS?</title><content type="html">Excel 2010 (and presumably the next version of Excel) have taken some security precautions with regards to macros in Excel files.&amp;nbsp; If a spreadsheet has macros in it, you can't save it as an XLSX.&amp;nbsp; Excel forces you to save it with an extension of XLSM, indicating that the file has macros in it.&amp;nbsp; The assumption being, I suppose, to make it a little harder to sneak a malicious macro under a user's nose when they're not expecting one.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Problem&lt;/span&gt;&lt;br /&gt;
This causes problems with SQL Server Integration Services 2005 and 2008, because the developers didn't take macro-enabled files into consideration when they designed the Excel Connection Manager.&amp;nbsp; If you attempt to&amp;nbsp;use a macro-enabled Excel file name in the Connection Manager, it will report that the path "contains invalid Excel File" (bad English too).&amp;nbsp; It recommends you identify a file with an XLS or XLSX extension.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;The Solution&lt;/span&gt;&lt;br /&gt;
Point the Connection Manager to a valid Excel XLSX file - any one will do, and save it.&lt;br /&gt;
Edit the Connection Manager properties (press F4) and change the ExcelFilePath property to your actual macro-enabled Excel file.&amp;nbsp; Consider SSIS fooled.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y6dZBP8Oyqk:vQjNEK9kh20:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=y6dZBP8Oyqk:vQjNEK9kh20:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=y6dZBP8Oyqk:vQjNEK9kh20: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=y6dZBP8Oyqk:vQjNEK9kh20: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=y6dZBP8Oyqk:vQjNEK9kh20:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=y6dZBP8Oyqk:vQjNEK9kh20:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/y6dZBP8Oyqk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/8765728557985241076/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/04/quick-reference-how-do-i-read-excel.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8765728557985241076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/8765728557985241076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/y6dZBP8Oyqk/quick-reference-how-do-i-read-excel.html" title="Quick Reference: How Do I Read an Excel XSLM (Macro-Enabled) File 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>3</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2012/04/quick-reference-how-do-i-read-excel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08EQHs5eSp7ImA9WhVQE0s.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-7712745602203431471</id><published>2012-04-02T05:30:00.000-07:00</published><updated>2012-04-02T05:30:01.521-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-02T05:30:01.521-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="Quick Hit" /><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Custom Objects" /><category scheme="http://www.blogger.com/atom/ns#" term="ReinitializeMetaData" /><category scheme="http://www.blogger.com/atom/ns#" term="SSIS Component Validation" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Services (SSIS)" /><title>Quick Tip: Custom Component Performance</title><content type="html">As regular readers will know, I've got a few custom components for SQL Server Integration Services under my belt, some of which I've published at &lt;a href="http://www.codeplex.com/site/users/view/toddmcdermid"&gt;CodePlex&lt;/a&gt;.&amp;nbsp; As I was working with one of the components I haven't published, I got a little frustrated with the length of time it was taking the UI to appear when I'd double-clicked it, as well as the length of time it took to return to the design surface after accepting my changes.&lt;br /&gt;
After a little investigation, the excessive time could be traced to a single type of operation that occurs several times in this component inside the Validate and ReinitializeMetaData methods.&amp;nbsp; It's quite a common thing to do - so if you happen to have created any components for SSIS, I suggest you read on .&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;What's Slow?&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="http://www.flickr.com/photos/redbettyblack/11316204" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="176" src="https://public.sn2.livefilestore.com/y1p67ZhMGkn9RL4vqkN0TCmYz6X-Uf5jCC540OLXUOETleWAVDJUIxcD7Q0XeuFGMPQMtur7-Kev_Alkn9vd3fgKQ/20120402%20Roundabout.jpg?psid=1" width="200" /&gt;&lt;/a&gt;The performance drag?&amp;nbsp; Iterating over IDTSInputColumnCollections and IDTSOutputColumnCollections.&amp;nbsp; Probably a no-brainer for you knowledgeable COM interop experts out there - but iterating over those collections is &lt;strong&gt;slow&lt;/strong&gt;.&lt;/div&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Where's the Nitrous?&lt;/span&gt;&lt;br /&gt;
To avoid those iterations, I constructed my own "temporary" collection(s) with the same elements to iterate over instead.&amp;nbsp; In some cases I used a Hashtable (keyed by column name or lineage ID), and in some cases a simple List was just fine.&amp;nbsp; I still incurred one performance hit in building my temporary collection - because I had to iterate over the COM collection once.&amp;nbsp; After that, smooth sailing and a huge performance increase.&lt;br /&gt;
&lt;span style="color: #e69138; font-size: large;"&gt;Warning...&lt;/span&gt;&lt;br /&gt;
Do be a little careful though!&amp;nbsp; Creating a temporary collection to "mirror" the built-in one is perfectly safe when in the Validation context, because nothing is permitted to change.&amp;nbsp; However, you have to watch your own code and the "staleness" of your collection in the ReinitializeMetaData context.&amp;nbsp; Both you and SSIS can be altering the input and output collections at this time.&amp;nbsp; So if you're playing with the UsageType on inputs, or adding or removing columns from asynchronous outputs, you'll have to make similar adjustments to your temporary collections or they'll get out of sync.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=MRzsGEpfCVw:aNwu2f0Lk-Q:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=MRzsGEpfCVw:aNwu2f0Lk-Q:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=MRzsGEpfCVw:aNwu2f0Lk-Q: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=MRzsGEpfCVw:aNwu2f0Lk-Q: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=MRzsGEpfCVw:aNwu2f0Lk-Q:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=MRzsGEpfCVw:aNwu2f0Lk-Q:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/MRzsGEpfCVw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/7712745602203431471/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/04/quick-tip-custom-component-performance.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7712745602203431471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7712745602203431471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/MRzsGEpfCVw/quick-tip-custom-component-performance.html" title="Quick Tip: Custom Component Performance" /><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/2012/04/quick-tip-custom-component-performance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cEQXs9fip7ImA9WhVRF0s.&quot;"><id>tag:blogger.com,1999:blog-5269388141224850580.post-7601340081347531555</id><published>2012-03-26T05:30:00.000-07:00</published><updated>2012-03-26T05:30:00.566-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-26T05:30:00.566-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Administrivia" /><category scheme="http://www.blogger.com/atom/ns#" term="Community" /><title>It's Quiet... Too Quiet</title><content type="html">It's been a LONG time since I've posted something -&amp;nbsp;but that trend&amp;nbsp;that&amp;nbsp;will change shortly!&amp;nbsp; I've been working on a number of special projects within Moulding and Millwork&amp;nbsp;- some related to data gathering, curating, and analysis,&amp;nbsp;and some less so.&amp;nbsp; It's taken away some of the time I'd previously had available for working on the MSDN forums, my blog, speaking, and working on custom objects for SSIS.&lt;br /&gt;
The workload of those special projects has diminished a little, and now that SQL 2012 is here, I've got to get back to some professional development in my own bailiwick.&amp;nbsp; I'll also make sure to prod Scott Stauffer to make some time to share his thoughts via his blog as well.&amp;nbsp; It's not his normal outlet (you can usually find him cultivating user groups and events) but he's said he wants to do a little more, so I'll make that happen.&lt;br /&gt;
&lt;span style="color: orange; font-size: large;"&gt;Presentations&lt;/span&gt;&lt;br /&gt;
First and foremost,&amp;nbsp;I'll be&amp;nbsp;getting ready for some speaking engagements this year:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;April 19th, I'll be speaking at the PASS Data Architecture VC.&amp;nbsp; This is a free online presentation of your options within SSIS for processing dimensions.&lt;/li&gt;
&lt;li&gt;At the end of&amp;nbsp;May, SQLTeach returns to Vancouver!&amp;nbsp; I'll be presenting two sessions very much related to Integration Services: Common Application Patterns, and Integrating Spreadsheets with Enterprise Data.&amp;nbsp; If you're near Vancouver then, I highly recommend the conference.&amp;nbsp; It's got a great panel of speakers, and it might be your first opportunity to get some insight into SQL 2012 and what it might mean to your environment.&lt;/li&gt;
&lt;/ul&gt;
On top of those two, there are&amp;nbsp;a couple other events this year I'll be submitting talks to - I'll keep you posted on those.&lt;br /&gt;
&lt;span style="color: orange; font-size: large;"&gt;Blogging&lt;/span&gt;&lt;br /&gt;
Even though I haven't published any posts in the last few months, I have a few (42) started.&amp;nbsp; I'll find the time to polish some off and get them out the pipe.&amp;nbsp; In particular, I finally cracked the OpenXML API to get at Excel spreadsheets without using the fickle OLE API.&amp;nbsp; It's no less complex, but at least it works consistently and reliably.&lt;br /&gt;
I've also got a few design patterns and other thoughts to share - look for those soon.&lt;br /&gt;
&lt;span style="color: orange; font-size: large;"&gt;Custom Objects&lt;/span&gt;&lt;br /&gt;
I'm primarily talking about the Dimension Merge custom component here - but&amp;nbsp;this applies equally to some of the other tasks and&amp;nbsp;components I've developed over the past couple years.&amp;nbsp; I've made some small changes that haven't been put up to CodePlex, and there is a short list of needed adjustments that I'll be getting to.&amp;nbsp; Top of that list is to get the code for all of them prepped for SQL 2012 and SSDT.&amp;nbsp; There are some specific enhancements that could help performance out on some of them that I'd like to take advantage of.&lt;br /&gt;
&lt;span style="color: orange; font-size: large;"&gt;Q&amp;amp;A&lt;/span&gt;&lt;br /&gt;
Last, but definitely not least... this was actually the first thing I "got back into" as my workload returned somewhat to regular levels... trolling the MSDN forums.&amp;nbsp; If you've got a question about Integration&amp;nbsp;Services, it's by far the best location on the internet to find an answer.&amp;nbsp; I agree, it may not have the best forum software, but it definitely has the critical mass of traffic to make turnaround on questions quick, and of reasonable quality.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cZngTXOpXHc:CMdgQ1tt4jI:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=cZngTXOpXHc:CMdgQ1tt4jI:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?a=cZngTXOpXHc:CMdgQ1tt4jI: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=cZngTXOpXHc:CMdgQ1tt4jI: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=cZngTXOpXHc:CMdgQ1tt4jI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ToddMcdermidsBlog?i=cZngTXOpXHc:CMdgQ1tt4jI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ToddMcdermidsBlog/~4/cZngTXOpXHc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmcdermid.blogspot.com/feeds/7601340081347531555/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://toddmcdermid.blogspot.com/2012/03/its-quiet-too-quiet.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7601340081347531555?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5269388141224850580/posts/default/7601340081347531555?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ToddMcdermidsBlog/~3/cZngTXOpXHc/its-quiet-too-quiet.html" title="It's Quiet... Too Quiet" /><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/2012/03/its-quiet-too-quiet.html</feedburner:origLink></entry><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="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://toddmcdermid.blogspot.com/2011/10/pass-community-summit-2011-day-3.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/10/what-i-learned-at-spc11.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/10/new-guy-joins-our-team.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/09/parallelizing-slow-parts-of-data-flow.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/08/inserting-records-and-getting-identity.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/08/anyone-want-to-work-with-me.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/07/quick-hit-using-xlsm-files-with-ssis.html#comment-form" title="1 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>1</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="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://toddmcdermid.blogspot.com/2011/07/pass-summit-2011-content-its-your.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/07/presenting-upserts-to-pass-appdev-vc.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/07/what-is-pipeline-backpressure.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/06/code-snippet-for-ssis-dataflow.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/06/how-do-you-deal-with-excel-in-ssis.html#comment-form" 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="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://toddmcdermid.blogspot.com/2011/05/use-connections-properly-in-ssis-script.html#comment-form" title="15 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>15</thr:total><feedburner:origLink>http://toddmcdermid.blogspot.com/2011/05/use-connections-properly-in-ssis-script.html</feedburner:origLink></entry></feed>
