<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Old School Database Guy</title><subtitle type="html">A pithy delightful romp through the database world.</subtitle><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/atom.aspx</id><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/atom.aspx" /><generator uri="http://communityserver.org" version="2.0.60217.2664">Community Server</generator><updated>2008-04-18T09:01:00Z</updated><entry><title>SQL Azure First Looks</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/08/31/14513.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/08/31/14513.aspx</id><published>2009-08-31T22:52:00Z</published><updated>2009-08-31T22:52:00Z</updated><content type="html">I had a look at the latest on SQL Data Services, also called SQL Azure at &lt;A HREF="http://www.msteched.com/online/view.aspx?tid=01053bed-425d-4152-a293-e96fef6240fc"&gt; http://www.msteched.com/online/view.aspx?tid=01053bed-425d-4152-a293-e96fef6240fc  &lt;/a&gt; and I would recommend all you database folk have a look as well.  
&lt;p&gt;
I see some really good things here, but also some troubling issues.  The bad news:&lt;p&gt;
1.	There is no integration with Windows security, therefore no real way to audit data access.  This is a big issue for anyone storing sensitive data or with a regulatory  requirement for a data access audit trail (e.g. medical applications and anyone holding my financial data).&lt;p&gt;
2.	There is a 10 GB limit on database size – read small applications only.&lt;p&gt;
3.	This is a hosted environment; therefore people outside your organization have physical access to the data.  This is a problem in certain regulated enterprises, again like medical providers.  
&lt;p&gt;The good news:
&lt;p&gt;1.	Rapid deployment.  No more need to wait to get hardware installed.
&lt;p&gt;2.	The hosting company is Microsoft, so the physical security is probably much better here than it might be for the typical small or medium size business.
&lt;p&gt;3.	This is ideal for smaller applications with shorter lifecycles.  For example, dealing with contractor to sub contractor relations on a short term project, or quick applications to take advantage of a trend or seasonal retail opportunity (ski season is almost here, for example).
&lt;p&gt;4.	There would appear to be a great opportunity for “application in a can” scenarios, where you want to have a shell of an application you can modify rapidly and deploy, like an on line store or catalog that requires a small amount of customization.   
&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=14513" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Towards a Database Professional’s Code of Ethics</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/08/26/14507.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/08/26/14507.aspx</id><published>2009-08-27T00:16:00Z</published><updated>2009-08-27T00:16:00Z</updated><content type="html">I have been giving a great deal of consideration to the ethics of data storage and manipulation lately.  I have documented in the past certain extreme lapses in database security and additional lapses are routinely reported.  The recent indictment of &lt;A HREF="http://www.usdoj.gov/opa/pr/2009/August/09-crm-810.html"&gt;Albert Gonzalez (http://www.usdoj.gov/opa/pr/2009/August/09-crm-810.html )&lt;/a&gt; is but one example.  &lt;p&gt;
&lt;br&gt;
In my own life, I have been the victim of data theft at least twice.  In both cases, a credit card number was stolen.  Once, by a waiter who swiped the magnet strip of my card twice – once for the restaurant and once to sell the data.  The second time resulted from a hack of a vendor I have done some business with, though I do not know the exact nature of this hack.  Just this morning, we were informed that one of my wife’s credit card numbers had been used for purchases outside of the USA.  We do not know how this particular theft occurred yet.
&lt;br&gt; &lt;p&gt;
Start with what should be a self evident proposition:   when you are entrusted with sensitive information, you have a duty to prevent the misuse of that information.  In Buddhism one has a duty to reduce the suffering in the world.  In Islam, there is an affirmative duty to prevent crime.  While no Bible or Torah quote springs to mind, I find it difficult to believe that a Rabbi or Christian minister would reject this proposition.   
&lt;br&gt; &lt;p&gt;
This duty arises from the basic, though unspoken, properties of the commercial transaction.  I pay for goods or services via a credit card, thus providing the merchant with access to my line of credit for the limited purpose of obtaining the agreed upon funds.  The merchant does not have permission to use or distribute that access to anyone else for any other purpose.  I trust the merchant to limit access to this information for the limited purposes only.  The merchant breaks that trust when he allows access by others to this information, whether intentionally or through their failure to exercise reasonable care.  
&lt;br&gt; &lt;p&gt;
Again and again I am amazed at the failure of organizations to take even the most basic steps to secure data, ensuring that people (myself included) will become the victims of identity theft.  In the case of my wife and I, we were lucky that our credit card company caught the issue early (and bravo to whoever wrote the data mining programs at Citibank to catch these crimes early).  
&lt;br&gt; &lt;p&gt;
Others are not so lucky.  Mr. Gonzalez and his associates are alleged to have stolen 130 million credit and debit card accounts from several companies.  Radisson hotels recently revealed a security breach that resulted in theft of credit card data in the United States and Canada.  
&lt;br&gt; &lt;p&gt;
Yet, even with these reports in the news and with an ever increasing amount of cyber crime, I routinely find the cyber-security equivalent of a bank leaving piles of cash deposits in the lobby.  I would like to propose that we, as database professionals, take onto ourselves a code of professional responsibility.  I would love to get input on this, but I think the first step would be this commitment:
&lt;br&gt; &lt;p&gt;
&lt;i&gt;Recognizing that people entrust their identity, personal and financial data to me, I have taken on a sacred duty to protect that data and, thereby, protect the people who have placed their trust in me.  I will take all reasonable steps to ensure the safety and security of that data in its storage and transmission.
&lt;/i&gt; &lt;p&gt;
&lt;br&gt;
Reasonable steps would include:
 &lt;p&gt;&lt;br&gt;•	Ensuring network protections are available to safeguard against unauthorized access
&lt;br&gt; &lt;p&gt;•	Ensuring software is written to prevent SQL injection attacks
&lt;br&gt; &lt;p&gt;•	Logging and auditing all data access
&lt;br&gt; &lt;p&gt;•	Ensuring that access to system administration accounts and DBO accounts is limited to appropriate staff
&lt;br&gt; &lt;p&gt;•	Strictly limiting data access to the data one needs to do one’s job, and no more
&lt;br&gt; &lt;p&gt;•	Encrypting all sensitive data in storage
&lt;br&gt; &lt;p&gt;•	Encrypting all sensitive data in transit
&lt;br&gt; &lt;p&gt;•	Ensuring that all security patches, anti-virus and anti-intrusion software is working and up to date
&lt;br&gt; &lt;p&gt;•	Prevent the storage of sensitive data on local systems, laptops and thumb drives.
&lt;br&gt; &lt;p&gt;•	All users should use strong passwords.
&lt;br&gt; &lt;p&gt;
Got any more?
&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=14507" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Interesting news item</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/04/08/13468.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/04/08/13468.aspx</id><published>2009-04-08T14:54:00Z</published><updated>2009-04-08T14:54:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;The &lt;EM&gt;Wall Street Journal&lt;/EM&gt; is &lt;A href="http://online.wsj.com/article/SB123914805204099085.html"&gt;reporting &lt;/A&gt;serious compromises in computer security around key infrastructure in the United States.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I would not be surprised if the same issues are present in the other countries of the G-20.&amp;nbsp; The article can be found at &lt;A href="http://online.wsj.com/article/SB123914805204099085.html"&gt;http://online.wsj.com/article/SB123914805204099085.html&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;While it is not surprising that the attempted hacks occurred, it is surprising that the companies involved did not catch them.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Instead various government intelligence and law enforcement agencies discovered the intrusions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;For me, the surprise came in just how much infrastructure is vulnerable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It does extend to items I had not considered in the past.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I expect nuclear power plants, the NY Stock exchange and NASDAQ to be targets, and thus have very sophisticated defenses.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I did not think of sewage treatment plants, for example, as targets, but when one considers the damage that could be done – as well as the pure gross out factor (if one can apply the term “pure” in this situation) – then they are a target.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Living in Colorado, where one is upstream from pretty much everyone west of the Mississippi, one realizes the damage this could do.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;A hack on sewage treatment facilities on the treatment plants for just the cities on the front range (Pueblo, Colorado Springs, Denver and Fort Collins, plus associated smaller communities) &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;would be devastating not just to those cities, but to Eastern Colorado, Kansas, Nebraska, Missouri, Oklahoma, Texas, Arkansas and Louisiana as well.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=13468" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>SSIS Logging Best Practices Part 2</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/03/24/13247.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/03/24/13247.aspx</id><published>2009-03-24T22:04:00Z</published><updated>2009-03-24T22:04:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;This article is a continuation of &lt;/FONT&gt;&lt;A HREF="/blogs/old_school_database_guy/archive/2009/03/23/13221.aspx"&gt;&lt;FONT face=Calibri&gt;http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/03/23/13221.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That article dealt with error logging for system failures or other unrecoverable errors for a SSIS package.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In this post, I will deal with data quality errors that prevent individual rows from loading.&lt;/FONT&gt;&lt;/P&gt;
&lt;H1&gt;&lt;FONT face=Cambria color=#365f91 size=5&gt;SSIS Logging Best Practices&lt;/FONT&gt;&lt;/H1&gt;
&lt;H3&gt;&lt;FONT face=Cambria color=#4f81bd size=3&gt;WTF Logging&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Every ETL project invariably comes across data in unexpected formats or is otherwise a knuckleball (apologies to Europeans for the baseball analogy).&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;For example, you are expecting integers and get “two” instead of “2” – Where’s That From?&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;None of these issues will rise to the level where an application can or should fail.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Instead, these represent business rule or data quality issues that should be reported back to users so the issues might be addressed.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Many of which can be quite amusing in hindsight.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I worked on one application where with and HL7 (HL7 is a health care industry standard for data transfer) data source having a patient’s blood type in a field that was supposed to hold the social security number.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;In another application, the “cumulative” production of an oil well would reset to 0 from time to time by the source system because of a source system bug.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So, when calculating average production of a well, we tried to use a simple formula of&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;(Cumulative Volume Now – Cumulative Volume Then)/elapsed time&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;with a “cumulative” volume reset to zero we would get a negative number as a result – implying the company was putting oil back in the ground.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;At the price at the time, about $140/barrel, this seemed unlikely.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;These three examples illustrate different types of data quality issues each of which might be handled in different ways using SSIS.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Those issues can broadly be classified as&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;1.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Data from the source system fails some constraint or business rule on the target system&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;2.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;The source system consistently violates some standard, either industry wide or a corporate standard&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;3.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;A bug in the source system produces unexpected or illogical data.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;There are numerous ways to handle these issues as they arise.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The first, and my preference, is to work with the folks running the source systems to resolve the issues.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This usually involves a dope slap, accompanied with some variation of “What ‘cha stew-ped?! You ain’t supposed ta put dat data in dat field!”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Unfortunately this method, while effective, violates most HR policies.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Your fallback here should be more politic negotiations around field mappings, particularly where you wish to keep your data mappings within some reasonable semblance of logic and industry standards.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;The next thing that should be done is to enforce business rules and logical rules on the target database itself.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;While this is a standard best practice for database design, it is remarkable how often developers fail to follow this practice.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;SSIS provides easy mechanisms for logging violations of these rules or constraints.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So, for example, consider the case where the “cumulative” volume of oil pumped from a well is reset to zero.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;A simple check constraint on the target field enforces the rule that the cumulative volume for today must be greater than or equal to the cumulative volume for yesterday.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Should this test fail, the insert of today’s data will fail.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;SSIS can then catch and log this failure for this one row of data, while continuing to load data that complies with the business rule.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;So we see, below, an extremely simple example of how this can be handled.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Data is extracted from an OLE DB source to be loaded directly to an OLE DB target.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Should any insert fail, the data will be written to a comma delimited file along with the error code and the error column.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A HREF="/photos/old_school_database_guy/picture13246.aspx" target=_blank&gt;&lt;IMG height=169 src="/photos/old_school_database_guy/images/13246/thumb.aspx" width=155 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Most frequently, the business process breaks down at this point.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;You have this data in some form of log… and then?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Best practice is to provide an easy user interface that will allow a business user to address these issues.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;At a minimum, this interface would provide:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;1.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Identifying information that will allow a user to track the offending data to its source;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;2.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;A plain English (or French, or Mandarin, or whatever) reason that the insert or update failed.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This will require that you translate the error code.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The codes themselves can be found at &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms345164.aspx"&gt;&lt;FONT face=Calibri&gt;http://msdn.microsoft.com/en-us/library/ms345164.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt; for SQL Server 2008 and at &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms345164(SQL.90).aspx"&gt;&lt;FONT face=Calibri&gt;http://msdn.microsoft.com/en-us/library/ms345164(SQL.90).aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt; for SQL Server 2005.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Adding an error description requires a single line of script, as described in the SSIS help topic &lt;I&gt;Enhancing an Error Output with the Script Component&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;3.&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Additional information that will help the user to identify the error.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;For example, simply telling the user “The data value violated the schema constraint.” is not helpful.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You must tell the user why the constraint was violated so they can do their job to fix the issue.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H3&gt;&lt;FONT face=Cambria color=#4f81bd size=3&gt;Audit and Event Driven Logging&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;There will be times when the business requires auditing of data transfers.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Most of these requirements can be met with the event driven logging internal to SSIS.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;The basic logging screen is relatively simple.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You just select which events to log.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A HREF="/photos/old_school_database_guy/picture13246.aspx" target=_blank&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A HREF="/photos/old_school_database_guy/picture13245.aspx" target=_blank&gt;&lt;IMG height=135 src="/photos/old_school_database_guy/images/13245/thumb.aspx" width=233 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;On the advanced screen, you have more control over what gets logged, as shown below&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A HREF="/photos/old_school_database_guy/picture13244.aspx" target=_blank&gt;&lt;IMG height=92 src="/photos/old_school_database_guy/images/13244/thumb.aspx" width=230 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;You should be cautious with SSIS logging.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It carries a large I/O overhead and can slow application performance dramatically.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Unless absolutely required I would limit SSIS logging to OnError and OnTaskFail and OnWarning events.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;The How&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;How one should log will vary by your specific situation.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Here, I have limited myself to the simplest text file logging.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can also log to any OLE DB compliant application you choose by selecting the correct tool from the SSIS toolbox, or creating your own custom script or class.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is limited only by your imagination.&lt;/FONT&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Conclusion&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;SSIS logging is a powerful tool the use of which is limited only by your imagination.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=13247" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>SSIS Logging Best Practices:  Part 1</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/03/23/13221.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/03/23/13221.aspx</id><published>2009-03-24T00:23:00Z</published><updated>2009-03-24T00:23:00Z</updated><content type="html">&lt;H1&gt;&lt;FONT face=Cambria color=#365f91 size=5&gt;SSIS Logging Best Practices&lt;/FONT&gt;&lt;/H1&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;One of the things we often forget as software developers is that, after we are finished writing our brilliant code, someone will need to actually operate the system we have created.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Frankly, no matter how spectacular our code may be, there is no way we can anticipate everything that may change in a system, or the myriad ways other developers and the user community might change requirements or otherwise play with our heads.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Issues concerning system changes, data changes and errors are particularly acute in any ETL work, as ETL code, by definition, must bridge two or more systems, and those systems will certainly change over time.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Even without new development, there will certainly be upgrades, patches and other changes that can cause issues.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In addition, the user community will continually add data to source systems.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Data might well be “allowable” on the source system but violate a business rule set on the target system, causing your elegantly designed ETL code to throw up like a frat boy on his 21&lt;SUP&gt;st&lt;/SUP&gt; birthday.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;We therefore need to design our systems so that we can not only recover from these errors, if possible, but also provide sufficient information to the appropriate folks so they can address these issues on an ongoing, operational basis.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This raises the issues of WHAT should be logged and WHERE it should be logged, versus HOW you should log it.&lt;/FONT&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT face=Arial color=#4f81bd size=4&gt;The WHAT and WHERE….&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Broadly speaking there are three main areas for logging, &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Things that go bump in the night&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;WTF (as in”Where’s This From?” …. Get your minds out of the gutter)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Event driven logging or Audit logs&lt;/FONT&gt;&lt;/P&gt;
&lt;H3&gt;&lt;FONT face=Arial color=#4f81bd size=3&gt;Things that go bump in the night&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;To be precise, these things can go bump at any time, but the typical ETL job is run late in the evening or during early morning hours, when data is extracted from a transactional system and loaded into a data mart or warehouse for analysis, or when different systems are synchronized during a maintenance window.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Specifically here, I am referring to unrecoverable errors.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As good developers we need to provide the operations staff with enough information for them to find and fix the issue. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;As self-centered megalomaniacs, we need to provide this data so we are not getting phone calls in the early morning hours or on weekends asking us to come in and fix a broken system.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;These issues should be (but often are not) rare.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For example, it is difficult to imagine how one can programmatically recover from someone kicking the power cord out of the source systems server.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We simply need to build our code with a nod to the fact that it runs on a machine and machines occasionally break. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;When these events occur, the error needs to be raised in such a way that it is visible to the folks who can begin to address the issue.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;So, the first thing required here is some interface for the operations staff to view status of each job as it runs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Let me say the following in biog bold letters, so we are very clear…&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face=Arial&gt;NEVER, EVER USE EMAIL TO REPORT ERRORS!!!!!!!!!!!!!!&lt;SPAN&gt;&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;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Why? The inexperienced may well ask.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;First, email lists for notification purposes are rarely, if ever maintained or kept up to date.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Second, everyone, without exception, puts rules on their email accounts to route such emails to some folder.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;No matter what this folder is named the name means “Ignore Until Management Calls.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The result is the error is ignored until you have annoyed users.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Third, bad things come in threes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So invariably, if the first thing bad is that the application died, the second thing bad is that the person who gets the email about it is out sick, on vacation or otherwise unavailable, and is probably in some remote location with no cell phone coverage.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The third bad thing will be the 2 AM call you get to get out of bed and come in to fix the problem.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Fourth, many times these emails are sent to groups. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;It is an ironclad law of corporate behavior that when everyone is responsible no one is responsible, so nothing will happen until someone with a “C” (as in “CIO”) in their title gets a call asking why there is no data.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is not where you want to be.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Ideally, there will be a simple interface with an easy to understand “red light, green light” approach to these errors.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That application will direct the operations staff to detailed – emphasis on detailed – messages that will help them.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Unfortunately, we often get rather cryptic error messages back from our applications.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Often we have stumbled across these issues while in the development cycle or handing off to operations.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We should be making it a practice to decipher these messages for the operations staff.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;For example, I recently completed a project that used a web service as a source for a data mart.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Towards the end of development, I would often get an exception in my code “An unknown error has occurred. Please contact the application administrator for further information.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is hardly the most informative error message ever created.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;However, we noticed that, invariably this error would arise because the web service server was down.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It seemed to me to be a matter of common courtesy, if nothing else, to pass this knowledge to the poor soul who would be getting it at 2 AM, when this data load was scheduled to run.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In this case, some simple code wrote the additional details out to a text file, and the path the text file was then put in the message logged in the Windows Event logs, as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;public static void RaiseTheAlarm(string errPath, string LoadName, Boolean writeToEventLog, Exception ex)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;//irrelevant code removed&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;StreamWriter ErrorWrite = new StreamWriter(logPath.ToString()&amp;nbsp; );&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine("There has been an error in the load of " + LoadName);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine("Exception Message");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine(ex.Message);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string errMess = ex.Message; &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ex.InnerException == null)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 (errMess.Contains("An unknown error has occurred. Please contact the application administrator for further information."))&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine("This error typically appears when there is a failure with a call to a web service.&amp;nbsp; Please chack the appropriate WCF service for errors.");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine("Inner exception: ");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine(ex.InnerException.Message);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 ( ex.InnerException.InnerException != null)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine("Inner exception: ");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.WriteLine(ex.InnerException.InnerException.Message);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.Flush();&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorWrite.Close();&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //irrelevant code removed&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;It should also be noted that, in this application the inner exception messages contained a good deal of information that could help solve the issue, so we always logged these when possible.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Where you raise such errors will depend on where the monitoring system looks for application status.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I have yet to find such a monitoring tool that did not look at the Windows Event Logs for errors, so that would be a good place to start.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Again, such code is quite simple using the EventLog class&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;if(! System.Diagnostics.EventLog.SourceExists(LoadName))&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.EventLog.CreateEventSource(LoadName,"Application");&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;StringBuilder PleaseSee = new StringBuilder();&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;PleaseSee.Append( "Please see ");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;PleaseSee.Append(logPath.ToString());&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;PleaseSee.Append(" for further details");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;System.Diagnostics.EventLog.WriteEntry(LoadName, ex.Message,System.Diagnostics.EventLogEntryType.Error);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;System.Diagnostics.EventLog.WriteEntry(LoadName, PleaseSee.ToString(), System.Diagnostics.EventLogEntryType.Error);&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;&amp;nbsp;&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;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;In this case, we simply note that an error has occurred, raise it to the Application event log and direct the user to a text file where they can find the details they need to diagnose the issues.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In short, this need not be complex, but it does need to provide the operations staff with the data they need to do their jobs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial&gt;Best practice is, therefore&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;1.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Operational staff needs a simple clear user interface to monitor ETL status (NOT EMAIL!).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;2.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Provide details someplace.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It is easy to simply write these details to a text file and provide the path to this file via the Windows Logs or the monitoring tool.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;FONT face=Arial&gt;&lt;SPAN&gt;&lt;SPAN&gt;3.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Have some courtesy.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you can provide more details then the exception thrown by the application, do so.&lt;/FONT&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=13221" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Today’s SSIS 2005 Gotcha’s</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/02/04/12455.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2009/02/04/12455.aspx</id><published>2009-02-05T00:30:00Z</published><updated>2009-02-05T00:30:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;I spent an hour today quietly cursing while I attempted to create a new configuration file for a SSIS package.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The error message was a classic non-helpful message…&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;“Could not&amp;nbsp;generate the configuration file. (Microsoft.Data.TransformationServices.Wizard)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Technical Details:&lt;BR&gt;===================================&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Could not complete wizard actions. (Microsoft Visual Studio)&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;===================================&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Could not generate the configuration file. (Microsoft.DataTransformationServices.Wizards)”&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;I began with the usual suspects.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The path was not read only, the file had been checked out for editing, no other path worked.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Finally I left off two of the variables I was attempting to put in the configuration file, et voila, it worked.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The variables in question were object type variables.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Had I thought about it for a few seconds, I would have realized that configuration files are not .NET aware.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Moreover the generic system.object type could be almost anything, and configuration files really are limited to the more specific data types (e.g. strings, integers and the like).&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;It would be nice if the error message was a tad more informative however.&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=12455" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>No School Like Old School</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/07/24/11486.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/07/24/11486.aspx</id><published>2008-07-24T19:45:00Z</published><updated>2008-07-24T19:45:00Z</updated><content type="html">&lt;P&gt;&lt;SPAN&gt;I always hesitate to write about anything involving someone else’s code, lest the favor get returned.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In this case however, one must have some sympathy for the developer, as the source system for a particular ETL job was not yet in production.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He had to write his packages against highly idealized, hypothetical test data.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Surprise! Surprise! The real data causes some issues.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;My predecessor followed a standard set of steps for any SSIS work for loading a data mart: &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;1.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Get source data and load it to a staging table &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;2.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Select data from the staging table relevant to the fact table to be populated&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;3.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;"Look up" relevant foreign keys using data from the staging table - this creates the correct referential integrity between the fact and dimension tables in the data mart. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;This was done with a look up task in SSIS.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;4.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Load the fact table with the results of the prior two steps. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Once we got into “real” data, the issues associated with look up tasks became apparent.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We repeatedly saw errors in the look ups.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The error, however was extremely vague and provided no direction or ability to track down the issue.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It was “Row yielded no match during lookup.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The first source of these errors were the differences between the datatypes and collations used in the actual source system, in this case Oracle and the target system, SQL Server 2005.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;When we used a simple SQL join, the joins also failed with collation errors.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It was not until we used a join with the appropriate collation logic that we were able to actually “look up” the data as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;SELECT&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;DISTINCT&lt;/SPAN&gt; &amp;lt;Columns&amp;gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;FROM&lt;/SPAN&gt;&lt;SPAN&gt; My&lt;SPAN&gt;.&lt;/SPAN&gt;STAGING_Table S &lt;SPAN&gt;left&lt;/SPAN&gt; &lt;SPAN&gt;outer&lt;/SPAN&gt; &lt;SPAN&gt;join &lt;/SPAN&gt;dbo&lt;SPAN&gt;.&lt;/SPAN&gt;dimension D &lt;SPAN&gt;on&lt;/SPAN&gt; S&lt;SPAN&gt;.&lt;/SPAN&gt;Unique &lt;SPAN&gt;=&lt;/SPAN&gt; D.Unique &lt;SPAN&gt;COLLATE&lt;/SPAN&gt; Latin1_General_CI_AS&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Other look up errors, frankly make no sense to me, as the data types and collations were the same and SQL “look ups” did not require data conversions or collation hints.&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN&gt;The simple “lookup” works fine&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN&gt;SELECT&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;*&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN&gt;from&lt;/SPAN&gt;&lt;SPAN&gt; STAGING&lt;SPAN&gt;.&lt;/SPAN&gt;myTable&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN&gt;where&lt;/SPAN&gt;&lt;SPAN&gt; uniqueString &lt;SPAN&gt;in&lt;/SPAN&gt; &lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;select&lt;/SPAN&gt; uniqueString&lt;SPAN&gt; &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;FROM&lt;/SPAN&gt; dbo&lt;SPAN&gt;.&lt;/SPAN&gt;DimensionTable&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;(Yes I know this is sloppy syntax.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It was a down and dirty test!)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In the end we replaced data transfer tasks with multiple look ups with a SQL selects and inserts using OLEDB sources and destinations.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Every lookup encountered could be replaced with a join or a common table element.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This provided several advantages.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;First, all of the data required was obtained with a single set operation, instead of multiple trips to the database to lookup values.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Second, we had much more insight into exactly where potentially “bad” rows of data existed, so we could handle those errors far more elegantly.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Third, the operations actually ran slightly faster.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Another reason to use those old school set operations!&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11486" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Security Report</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/06/12/11350.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/06/12/11350.aspx</id><published>2008-06-12T15:37:00Z</published><updated>2008-06-12T15:37:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;Verizon has just issued a new set of reports on security that make for interesting reading.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;One striking statistic, from my perspective as a developer, is that approximately 80% of security breaches arise from errors of omission by developers or administrators.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;A cure?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;All systems should go through a security test before launch and be subject to periodic mock attacks or hack attempts.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The report is available at &lt;A href="http://www.verizonbusiness.com/resources/security/databreachreport.pdf"&gt;http://www.verizonbusiness.com/resources/security/databreachreport.pdf&lt;/A&gt;. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;An executive summary is available at &lt;A href="http://www.verizonbusiness.com/about/news/displaynews.xml?newsid=25135&amp;amp;mode=vzlong&amp;amp;lang=en&amp;amp;width=530"&gt;http://www.verizonbusiness.com/about/news/displaynews.xml?newsid=25135&amp;amp;mode=vzlong&amp;amp;lang=en&amp;amp;width=530&lt;/A&gt; &lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11350" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>SSIS Error Codes</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/06/11/11349.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/06/11/11349.aspx</id><published>2008-06-11T20:46:00Z</published><updated>2008-06-11T20:46:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;If you have any experience with SSIS, you have come to realize that the error codes for SSIS are not the same as the error codes for SQL Server.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Personally, I would have preferred the same error code for the same error.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For example, a violation of a unique constraint in SSIS is -1071607685 while the same violation in T-SQL is 2627.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;SSIS error codes are typically hard to track down, but you can find them at &lt;A href="http://msdn.microsoft.com/en-us/library/ms345164.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms345164.aspx&lt;/A&gt;. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Is my curmudgeonly nature showing? &lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11349" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Green IT</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/05/01/11048.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/05/01/11048.aspx</id><published>2008-05-01T18:48:00Z</published><updated>2008-05-01T18:48:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;Jason Hiner, the executive editor of TechRepublic, recently published a story on Green IT (&lt;A href="http://blogs.techrepublic.com.com/hiner/?p=653&amp;amp;tag=nl.e138"&gt;http://blogs.techrepublic.com.com/hiner/?p=653&amp;amp;tag=nl.e138&lt;/A&gt; ).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In the article he claimed that Green IT is viewed by some as a fad or a myth.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Closer to the truth, I think, would be to say that the critics of “greenwashing” are pointing out that there is a great deal of marketing hype around something we as IT professionals should be doing anyway.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Part of our goal in any project is to deliver a solution with a low cost of operations.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We are not going a client any favors by creating a solution that requires more servers, with their attendant capital, licensing and operational costs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Our code and solutions need to be operationally efficient, to minimize these costs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If that has the happy consequence of conserving energy and preserving the planet, I am one happy man.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The bottom line for this, however, is the bottom line, not a lower carbon footprint.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11048" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Homeland Security Department Hacked!  (Are you feeling safe?)</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/29/11033.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/29/11033.aspx</id><published>2008-04-29T21:05:00Z</published><updated>2008-04-29T21:05:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;If you needed yet another reason to automate your security patches so they apply automatically, here it is:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;A href="http://blog.wired.com/monkeybites/2008/04/microsoft-datab.html"&gt;http://blog.wired.com/monkeybites/2008/04/microsoft-datab.html&lt;/A&gt;. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Apparently this SQL injection attack compromised several hundred thousand servers including the US Department of Homeland Security (feel safe yet?).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;I wonder if the folks who write code that is so open to attack lock their doors when they leave for work.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;My wife has a habit of checking to make sure the door is locked when we leave the house.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She checks not once, not twice, but three times.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Perhaps she could bottle that habit and sell it to developers who do not check their inputs for malicious attacks.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11033" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Extracting Complex XML for ETL</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/29/11032.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/29/11032.aspx</id><published>2008-04-29T18:29:00Z</published><updated>2008-04-29T18:29:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;The XML data source does not handle complexity within XML very well.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For the simplest XML it is fine, but for anything that is complex – in other words, real world data – one needs to resort to Script tasks or executables to actually get to data.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Whenever you see “&amp;lt;xsd:complexType name=”Whatever”&amp;gt;” you can be sure you will have issues with the XML data source.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;I have been doing some work with the PROML standard (&lt;A href="http://www.prodml.org/prodml/Default.asp"&gt;http://www.prodml.org/prodml/Default.asp&lt;/A&gt;).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For a glimpse at the complexity of some of these data models, have a look at &lt;A href="http://www.witsml.org/"&gt;http://www.witsml.org/&lt;/A&gt; or at &lt;A href="http://www.witsml.org/schemas/131/addendum/combo/doc/schema/obj_productVolume.html"&gt;http://www.witsml.org/schemas/131/addendum/combo/doc/schema/obj_productVolume.html&lt;/A&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For now, I am convinced that the easiest way to handle this is within a Script task or an executable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The steps would be:&lt;/P&gt;
&lt;OL&gt;
&lt;LI class=MsoNormal&gt;Create a proxy DLL (see &lt;A href="http://msdn2.microsoft.com/en-us/library/aa528855.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa528855.aspx&lt;/A&gt; for details)&lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Add the proxy DLL as a reference to your script task&lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Create a binding object&lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Create an endpoint object&lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Create a proxy object &lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Load the proxy with data&lt;/LI&gt;
&lt;LI class=MsoNormal&gt;Loop through the proxy hierarchy to get the data you need.&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal&gt;&lt;STRONG&gt;&lt;FONT size=5&gt;Binding:&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;We found in our tests that basic HTTP binding is very slow when used for ETL.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We were able to improve performance over 75% by using TCP binding instead of HTTP binding.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This will require some coordination between the SSIS development teams and the service development teams.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT size=5&gt;&lt;STRONG&gt;Endpoint and Proxy&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The endpoint is a one of the building blocks for the proxy object.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It simple serves to provide the service URL to the proxy.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;How you use the proxy will vary by your particular situation, but typically you will need to build a request object.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In our case we used a StreamReader to read an XML file, deserialized it and converted it to the object type the service expects.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Loading the data is a simple matter of calling the right method of the proxy object.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;STRONG&gt;&lt;FONT size=5&gt;Looping&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Your script will loop down through the hierarchy of the complex XML until you get to the data you need.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you have to obtain data from multiple levels then this is easily handled through each step in the loop.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT size=5&gt;&lt;STRONG&gt;Code Sample&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Here we fetch XML and write it to a simpler file in a SSIS script task.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can easily write this to a database as well.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&lt;SPAN&gt; fileRequests &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;String&lt;/SPAN&gt; = Dts.Variables(&lt;SPAN&gt;"fileRequests"&lt;/SPAN&gt;).Value.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; serviceURI &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;String&lt;/SPAN&gt; = Dts.Variables(&lt;SPAN&gt;"myServiceURI"&lt;/SPAN&gt;).Value.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; XMLOutputFile &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;String&lt;/SPAN&gt; = Dts.Variables(&lt;SPAN&gt;"strFileName"&lt;/SPAN&gt;).Value.ToString + &lt;SPAN&gt;"_"&lt;/SPAN&gt; + Dts.Variables(&lt;SPAN&gt;"XMLOutputFile"&lt;/SPAN&gt;).Value.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; XmlOutputFolder &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;String&lt;/SPAN&gt; = Dts.Variables(&lt;SPAN&gt;"XmlOutputFolder"&lt;/SPAN&gt;).Value.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; XMLOutputPath &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;String&lt;/SPAN&gt; = XmlOutputFolder + XMLOutputFile&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; binding &lt;SPAN&gt;As&lt;/SPAN&gt; System.ServiceModel.NetTcpBinding &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;binding = &lt;SPAN&gt;New&lt;/SPAN&gt; System.ServiceModel.NetTcpBinding&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;binding.Name = &lt;SPAN&gt;"ServiceEndpoint"&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;binding.MaxReceivedMessageSize = Int32.MaxValue&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;binding.SendTimeout = System.TimeSpan.MaxValue&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; endpoint &lt;SPAN&gt;As&lt;/SPAN&gt; System.ServiceModel.EndpointAddress = &lt;SPAN&gt;New&lt;/SPAN&gt; System.ServiceModel.EndpointAddress(serviceURI)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt; proxy &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;New&lt;/SPAN&gt; MyService.Client.PROD_ProductVolumeSoapClient(binding, endpoint)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;'deserialize the XML file &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; SrRequest &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;New&lt;/SPAN&gt; StreamReader(fileRequests)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; xmlQuerySet &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;New&lt;/SPAN&gt; XmlSerializer(&lt;SPAN&gt;GetType&lt;/SPAN&gt;(query_Object))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; objRequest &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;New&lt;/SPAN&gt; MyService.Client.query_Object&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;objRequest = &lt;SPAN&gt;CType&lt;/SPAN&gt;(xmlQuerySet.Deserialize(SrRequest), MyService.Client.query_Object)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;'get the data&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; objData &lt;SPAN&gt;As&lt;/SPAN&gt; &lt;SPAN&gt;New&lt;/SPAN&gt; MyService.Client.obj_Results&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;objData = proxy.GetDataSync(objRequest, &lt;SPAN&gt;Nothing&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;If&lt;/SPAN&gt; objData &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;‘do something to handle the error&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Exit&lt;/SPAN&gt; &lt;SPAN&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;'write the data to a file&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; doc &lt;SPAN&gt;As&lt;/SPAN&gt; XmlDocument = &lt;SPAN&gt;New&lt;/SPAN&gt; XmlDocument()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; rootNode &lt;SPAN&gt;As&lt;/SPAN&gt; XmlNode&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; recordElement &lt;SPAN&gt;As&lt;/SPAN&gt; XmlElement&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;doc.LoadXml(&lt;SPAN&gt;"&amp;lt;myResults/&amp;gt;"&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;rootNode = doc.SelectSingleNode(&lt;SPAN&gt;"//getMyResults"&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;For&lt;/SPAN&gt; &lt;SPAN&gt;Each&lt;/SPAN&gt; resultLevel1 &lt;SPAN&gt;As&lt;/SPAN&gt; obj_resultLevel1 &lt;SPAN&gt;In&lt;/SPAN&gt; objData.Result&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;For&lt;/SPAN&gt; &lt;SPAN&gt;Each&lt;/SPAN&gt; obj_resultLevel2 &lt;SPAN&gt;As&lt;/SPAN&gt; resultLevel2 &lt;SPAN&gt;In&lt;/SPAN&gt; resultLevel1.obj_resultLevel2&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;'do something useful with this data &lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;For&lt;/SPAN&gt; &lt;SPAN&gt;Each&lt;/SPAN&gt; resultSet &lt;SPAN&gt;As&lt;/SPAN&gt; ResultSet &lt;SPAN&gt;In&lt;/SPAN&gt; obj_resultLevel2.resultSet&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;If&lt;/SPAN&gt; resultSet.property &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;‘do something to handle the error&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;If&lt;/SPAN&gt; resultSet.property.uid.ToString &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;'do nothing.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We have an empty data set&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;MeasuredValue = resultSet.property.stringValue.Value.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;recordElement = doc.CreateElement(&lt;SPAN&gt;"myData"&lt;/SPAN&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;recordElement.SetAttribute(&lt;SPAN&gt;"MeasuredValue"&lt;/SPAN&gt;, MeasuredValue)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;rootNode.AppendChild(recordElement)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN&gt;As&lt;/SPAN&gt; Exception&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;'we'll need to log this bad data&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;doc.Save(XMLOutputPath)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;Dts.Variables(&lt;SPAN&gt;"XMLOutputPath"&lt;/SPAN&gt;).Value = XMLOutputPath&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN&gt;As&lt;/SPAN&gt; Exception&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;‘handle the error&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;errPath = &lt;SPAN&gt;"C:\Program Files\ErrorFiles\ERROR_"&lt;/SPAN&gt; + Format(Now(), &lt;SPAN&gt;"MMMddyyyyhhmmssf"&lt;/SPAN&gt;) + &lt;SPAN&gt;".TXT"&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Dim&lt;/SPAN&gt; swError &lt;SPAN&gt;As&lt;/SPAN&gt; StreamWriter = &lt;SPAN&gt;New&lt;/SPAN&gt; StreamWriter(errPath)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;swError.WriteLine(&lt;SPAN&gt;"Exception Message: "&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;swError.WriteLine(ex.Message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;If&lt;/SPAN&gt; ex.InnerException &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(&lt;SPAN&gt;"Inner Exception"&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(ex.InnerException.Message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;If&lt;/SPAN&gt; ex.InnerException.InnerException &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(&lt;SPAN&gt;"Inner Exception"&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(ex.InnerException.InnerException.Message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;If&lt;/SPAN&gt; ex.InnerException.InnerException.InnerException &lt;SPAN&gt;Is&lt;/SPAN&gt; &lt;SPAN&gt;Nothing&lt;/SPAN&gt; &lt;SPAN&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(&lt;SPAN&gt;"Inner Exception"&lt;/SPAN&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;swError.WriteLine(ex.InnerException.InnerException.InnerException.Message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;swError.WriteLine(&lt;SPAN&gt;"End Time"&lt;/SPAN&gt; + &lt;SPAN&gt;CStr&lt;/SPAN&gt;(Now()))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;swError.Close()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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;Dts.TaskResult = Dts.Results.Failure&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;Exit&lt;/SPAN&gt; &lt;SPAN&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Dts.TaskResult = Dts.Results.Success&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;End&lt;/SPAN&gt; &lt;SPAN&gt;Sub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11032" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Cheaper by the Dozen?</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/25/11001.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/25/11001.aspx</id><published>2008-04-25T16:31:00Z</published><updated>2008-04-25T16:31:00Z</updated><content type="html">

&lt;p class="MsoNormal"&gt;As I have written a few time, I think technical people have
an obligation to help our non-technical fellows, particularly around issues of
security.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br&gt;&lt;/p&gt;





&lt;p class="MsoNormal"&gt;An interesting article appeared on Slate.com (&lt;a href="http://www.slate.com/id/2189902/"&gt;http://www.slate.com/id/2189902/&lt;/a&gt; )
concerning how much an identity thief can get for your credit card.&lt;span&gt;&amp;nbsp; &lt;/span&gt;It turns our – not much.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Credit card numbers, by themselves, are being
offered for sale over IRC for as little as $0.40 per number.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;o:p&gt; &lt;br&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;The only conclusion I can draw is that the supply for these
numbers far out strips the demand.&lt;span&gt;&amp;nbsp; &lt;/span&gt;It
also follows that it must be remarkably easy to compromise some systems.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Of course, it may also be that the people who rip off credit
card numbers are also trying to rip off the people who buy those numbers, but I
would pause before ascribing such nefarious motives to such simple business
people just trying to make a living.&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=11001" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>A SSIS challenge</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/23/10985.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/23/10985.aspx</id><published>2008-04-23T14:17:00Z</published><updated>2008-04-23T14:17:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;SPAN&gt;One of the more interesting blogs out there (at least for those of us with no life) is Geek Trivia.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This week’s entry, at &lt;SPAN&gt;&lt;A href="http://blogs.techrepublic.com.com/geekend/?p=1260" target=_blank&gt;http://blogs.techrepublic.com.com/geekend/?p=1260&lt;/A&gt;, describes an interesting problem in data integration.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The problem is posed by the new L&lt;/SPAN&gt;arge Hadron Collider (LHC) — the largest scientific instrument ever built.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The LHC will be colliding sub atomic particles to attempt to replicate conditions immediately after the big bang.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;How do you handle a feed that is coming at a rate of 1.8 GB per second, store up to 15 petabytes (as in 10^15 bytes – as in more then a few) per year? &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;To top it off, the network can only handle 1 GB per second of data, so 0.8GB must be cached every second.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since the cache will not be cleared before new data hits, the cache will grow as a multiple of the length of time each test will take.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;An interesting challenge for a team of folks, it would seem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=10985" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry><entry><title>Dawn Breaks Over Marblehead</title><link rel="alternate" type="text/html" href="http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/18/10936.aspx" /><id>http://blog.avanadeadvisor.com/blogs/old_school_database_guy/archive/2008/04/18/10936.aspx</id><published>2008-04-18T21:01:00Z</published><updated>2008-04-18T21:01:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;I finally had a chance to catch up on some back issues of MSDN magazine today.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It is a task I generally put off as MSDN is targeted towards developers and, with all due respect, developers know nothing about databases, right?&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Like most database folks, particularly those who do lots of Oracle work, I became accustomed to a less then rigorous approach to source code control.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You write a script, make sure it runs and put it into whatever passes for source control – even if it is only a directory on a Linux server.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;With database people moving in and out of projects, this led inevitably to spaghetti coding practices that would make an old COBOL programmer blush.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It would also lead to an inability to restructure databases because you never knew what was important and what was not important or what would break if you changed anything.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Team Foundation (TFS) allows developers to use a test driven development methodology that has numerous advantages.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;It automates regression testing;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Simplifies some integration testing&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;Allows for easier incremental design changes&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;I read Jamie Laflen’s article in MSDN with great interest.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I do not think I need to repeat his description of how to use TFS – it is pretty straightforward and can be found at &lt;/FONT&gt;&lt;A href="http://msdn2.microsoft.com/en-us/magazine/cc164243.aspx"&gt;&lt;FONT face=Calibri color=#800080&gt;http://msdn2.microsoft.com/en-us/magazine/cc164243.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He did shake me out of an old style of development.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As is said in some neighborhoods in Boston “Dawn Breaks Over Marblehead!”&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Calibri&gt;It also goes to show that old school does not mean NO SCHOOL.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blog.avanadeadvisor.com/aggbug.aspx?PostID=10936" width="1" height="1"&gt;</content><author><name>Old School Database Guy</name><uri>http://blog.avanadeadvisor.com/members/Old+School+Database+Guy.aspx</uri></author></entry></feed>