<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Miky Schreiber's Blog - BI|SQL Server 2008|Integration Services</title>
    <link>http://www.miky-schreiber.com/Blog/</link>
    <description>Business Intelligence, Analysis Services, MDX, DataWarehousing and more...</description>
    <language>en-us</language>
    <copyright>Miky Schreiber</copyright>
    <lastBuildDate>Tue, 22 Jun 2010 12:40:51 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>miky@zahav.net.il</managingEditor>
    <webMaster>miky@zahav.net.il</webMaster>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>This is the fourth post about <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a></em>
          <em>'s seminar in the SQL &amp; BI conference. In this post, I'll write
some notes I collected from the third part of the seminar which discussed SSIS.</em>
        </p>
        <ul>
          <li>
Log everything that happens inside the package. Use the SSIS log providers and the
event handlers. The effect on performance is not significant. 
</li>
          <li>
Analyize the log data. You can analize total execution time, SSAS partition processing
time and much more.</li>
          <li>
Log detailed error information about rejected rows. You can even log the actual error
row.</li>
          <li>
Monitor also the execution of the ETL jobs.</li>
          <li>
Data Profiling is a new feature in SSIS 2008. It's used for analysis of the data's
quality in the DWH. Go and learn.</li>
          <li>
Configure everything you can in the package configuration, such as: tasks, containers,
variables, connection managers and data flow components. You can use XML config
file, config from parent package, registry configuration or even configuration from
a table.</li>
          <li>
The Cache Transformation saves data in the cache. It's very useful in lookups.</li>
          <li>
Data types: Make them as "small" as possible (better performance). Be aware of
precision issues when using money, float and decimal types.</li>
          <li>
Don't sort in SSIS unless it's absolutely necessary.</li>
          <li>
Sometimes using T-SQL will be faster then running it in SSIS.</li>
        </ul>
        <p>
Some of the tips are also relevant in Informatica. For example, I always let the DB
make the sort whenever possible. Sometimes it's also works with joins. Running packages
or procedures can be much more faster than running it in the ETL, but if you look
at it from maintenance point of view you'll do it in the ETL. It depends on much factors,
such as the time you can have to run the ETL, the knowledge in your team and more.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3" />
      </body>
      <title>Notes from the SQL &amp; BI conference - SSIS</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</link>
      <pubDate>Tue, 22 Jun 2010 12:40:51 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This is the&amp;nbsp;fourth post about &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;&lt;/em&gt;&lt;em&gt;'s seminar in the SQL &amp;amp; BI conference. In this post, I'll write
some notes I collected from the third part of the seminar which discussed SSIS.&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Log everything that happens inside the package. Use the SSIS log providers and the
event handlers. The effect on performance is not significant. 
&lt;/li&gt;
&lt;li&gt;
Analyize the log data. You can analize total execution time, SSAS partition processing
time and much more.&lt;/li&gt;
&lt;li&gt;
Log detailed error information about rejected rows. You can even log the actual error
row.&lt;/li&gt;
&lt;li&gt;
Monitor also the execution of the ETL jobs.&lt;/li&gt;
&lt;li&gt;
Data Profiling is a new feature in SSIS 2008. It's used for analysis of the data's
quality in the DWH. Go and learn.&lt;/li&gt;
&lt;li&gt;
Configure everything you can in the package configuration, such as: tasks, containers,
variables, connection managers and&amp;nbsp;data flow components. You can use XML config
file, config from parent package, registry configuration or even configuration from
a table.&lt;/li&gt;
&lt;li&gt;
The Cache Transformation saves data in the cache. It's very useful in lookups.&lt;/li&gt;
&lt;li&gt;
Data types: Make them as "small" as possible (better performance).&amp;nbsp;Be aware&amp;nbsp;of
precision issues when using money, float and decimal types.&lt;/li&gt;
&lt;li&gt;
Don't sort in SSIS unless it's absolutely necessary.&lt;/li&gt;
&lt;li&gt;
Sometimes using T-SQL will be faster then running it in SSIS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Some of the tips are also relevant in Informatica. For example, I always let the DB
make the sort whenever possible. Sometimes it's also works with joins. Running packages
or procedures can be much more faster than running it in the ETL, but if you look
at it from maintenance point of view you'll do it in the ETL. It depends on much factors,
such as the time you can have to run the ETL, the knowledge in your team and more.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=801cefae-7de4-4e1c-9ad4-115c70c2813e</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=801cefae-7de4-4e1c-9ad4-115c70c2813e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="MARGIN: 0px 1em 1em" height="50%" src="http://www.miky-schreiber.com/blog/content/binary/horseshoe.jpg" width="25%" align="left" />In
both SSIS and Informatica, the union transformation doesn't delete duplicate rows.
In SSIS it's clear because the transformation is called "Union all", which reminds
us the union all statement in SQL which doesn't remove duplicate rows. The confusing
part is in Informatica, where the transformation is called Union although it doesn't
remove duplicates. One of my teammates got confused this week so I thought it's worth
blogging about. 
<br /><br />
One more tip about ETLs with union transformations: When you'll investigate, maintain
or fix ETL it will be much help if you'll know where each row came from. That's why
I recommend adding a column named "src" or something like that and store there the
source of the row before the union happened.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=801cefae-7de4-4e1c-9ad4-115c70c2813e" />
      </body>
      <title>Union Transformations and Duplicate Rows</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</link>
      <pubDate>Mon, 09 Nov 2009 14:41:31 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="MARGIN: 0px 1em 1em" height="50%" src="http://www.miky-schreiber.com/blog/content/binary/horseshoe.jpg" width="25%" align=left&gt;In
both SSIS and Informatica, the union transformation doesn't delete duplicate rows.
In SSIS it's clear because the transformation is called "Union all", which reminds
us the union all statement in SQL which doesn't remove duplicate rows. The confusing
part is in Informatica, where the transformation is called Union although it doesn't
remove duplicates. One of my teammates got confused this week so I thought it's worth
blogging about. 
&lt;br&gt;
&lt;br&gt;
One more tip about ETLs with union transformations: When you'll investigate, maintain
or fix ETL it will be much help if you'll know where each row came from. That's why
I recommend adding a column named "src" or something like that and store there the
source of the row before the union happened.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=801cefae-7de4-4e1c-9ad4-115c70c2813e" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</comments>
      <category>BI;BI/Informatica;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/policeman.jpg" align="left" />
        <p>
Lucky for me, I have the opportunity to work with more than one ETL tool in my daily
work. In the far past, I worked much with DTS and PL/SQL packages (which is an ETL,
but not exactly a tool). Nowadays I work both with SSIS and Informatica so I
can compare them in several aspects. I don't think that one is better than the other.
It's just that they have different approaches to the ETL mechanism. Anyway, I always
expect that the data transformations will behave the same in every tool and I
found one transformation that behaves differently between the tools - the Router.
</p>
        <p>
The Informatica's Router, if you're not familiar with, receives a data row and
routes it a specific data flow. Its parallel transformation in SSIS is the Conditional
Split. As I said, I always thought that they behave the same. In both transformations
you provide boolean expressions that determine where the row will be routed. The difference
is that in SSIS, "<em>each input row can be sent to only one output, that being the
output for the first condition that evaluates to true</em>" (from SSIS's documentation).
In programmer's words, it behaves like switch-case statement with break in each condition.
In Informatica, <em>"If a row meets more than one group filter condition, the Integration
Service passes this row multiple times</em>" (from Informatica's documentation). Back
to the programmer's language, it's like switch-case statement with no break inside
the conditions.
</p>
        <p>
If you know other transformation that behaves different between ETL tools, I'll be
happy to know.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94" />
      </body>
      <title>Different Router behaviour in SSIS and Informatica</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</link>
      <pubDate>Tue, 27 Oct 2009 14:10:34 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/policeman.jpg" align=left&gt; 
&lt;p&gt;
Lucky for me, I have the opportunity to work with more than one ETL tool in my daily
work. In the far past, I worked much with DTS and PL/SQL packages (which is an ETL,
but not exactly a tool). Nowadays I work both with&amp;nbsp;SSIS and Informatica so I
can compare them in several aspects. I don't think that one is better than the other.
It's just that they have different approaches to the ETL mechanism. Anyway, I always
expect that the data transformations will behave the same in every tool&amp;nbsp;and I
found one transformation that behaves differently between the tools - the Router.
&lt;/p&gt;
&lt;p&gt;
The&amp;nbsp;Informatica's Router, if you're not familiar with, receives a data row and
routes it a specific data flow. Its parallel transformation in SSIS is the Conditional
Split. As I said, I always thought that they behave the same. In both transformations
you provide boolean expressions that determine where the row will be routed. The difference
is that in SSIS, "&lt;em&gt;each input row can be sent to only one output, that being the
output for the first condition that evaluates to true&lt;/em&gt;" (from SSIS's documentation).
In programmer's words, it behaves like switch-case statement with break in each condition.
In Informatica, &lt;em&gt;"If a row meets more than one group filter condition, the Integration
Service passes this row multiple times&lt;/em&gt;" (from Informatica's documentation). Back
to the programmer's language, it's like switch-case statement with no break inside
the conditions.
&lt;/p&gt;
&lt;p&gt;
If you know other transformation that behaves different between ETL tools, I'll be
happy to know.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</comments>
      <category>BI;BI/Informatica;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=f590b1f7-4d99-4539-bf47-349c121fd431</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,f590b1f7-4d99-4539-bf47-349c121fd431.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,f590b1f7-4d99-4539-bf47-349c121fd431.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f590b1f7-4d99-4539-bf47-349c121fd431</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">My friends were stuck with a totally weird
bug this week. After a day of frustration they called me for the rescue. It took me
some time to figure it out and I think that every SSIS developer (and maybe every
developer) can learn a thing or two from others' mistakes.<br /><br /><u>The mission:</u> The data flow takes one table with duplicate rows and copies it
to another table and makes sure that every row will appear only once. In the way,
the data flow also adds some irrelevant fields. Among them is the Create_User and
Create_Date fields which tells by who and when the package last ran.<br /><u>How my friends did it:</u> Again, it's a very simple flow. They only added Derived
Column transformation to add the new fields and then they added an Aggregate transformation
to make every row appear only once. 
<br /><img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationDataFlow.GIF" border="0" /><br />
Note that this is not the real package. It's a sample I did on my machine to show
it here.<br /><br /><u>The Bug:</u> When I first seen this it seemed to me very simple flow and I asked
myself how can it be that this is happening:<br /><img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregation.GIF" border="0" /><img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregation2.GIF" border="0" /><br />
As you can see, it seems that the Aggregate transformation is not deterministic. Sometimes
it outputs 99 rows, sometimes 198 and in some other times I get other results as well.<br /><u>Investigating:</u> I wanted to see what's the difference between the table that
I got in the first time (99 rows) and the table I got in the second time (198 rows)
so I changed the destination table and compared the two tables. I ran "select * from
A where Column1+Column2+... not in (select Column1+Column2+... from B)"-style query
but it was no use - it showed me that there were no rows that appeared only in one
of the tables. In this step I really started to think (as my friends did) that maybe
the Aggregate transformation has something wrong inside... Instead of blaming Microsoft,
I decided to think. I needed to see what can make the flow non-deterministic. Then,
it hit me.<br /><br /><img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationDerivedColumn.GIF" border="0" /><img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationAggregate.GIF" border="0" /><br />
The only non-deterministic component in the flow is the Derived Column because it
has the getdate() function (it may be simple to see here, but in the original package
the derived column transformation had many fields). The results of this function may
differ in the milliseconds, especially for large tables. Then I looked in the Aggregate
transformation and seen that the Create_Date column also was in the Group by operation,
meaning that if two rows has different millisecond they will be placed twice in the
destination table, although they are the same in every column. That's it, the bug
was found. But still, one question remained: Why the query did not show me this? The
answer is also simple but tricky to find: In the comparison query I concatenated all
the columns in the tables in order to compare the results. When I did this, I casted
the Create_Date to nvarchar which truncated the milliseconds. 
<p></p><u>Conclusions:</u><ul><li>
Pay attention to non-deterministic elements in what you do, whether it's code or ETL
process. 
</li><li>
When you do dummy stuff like checking all the checkboxes in a list - think what are
the outcomes. 
</li><li>
Call Miky when you're desperate.</li></ul><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=f590b1f7-4d99-4539-bf47-349c121fd431" /></body>
      <title>Non Deterministic Aggregation in SSIS ?</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,f590b1f7-4d99-4539-bf47-349c121fd431.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,f590b1f7-4d99-4539-bf47-349c121fd431.aspx</link>
      <pubDate>Sun, 21 Sep 2008 22:10:48 GMT</pubDate>
      <description>My friends were stuck with a totally weird bug this week. After a day of frustration they called me for the rescue. It took me some time to figure it out and I think that every SSIS developer (and maybe every developer)&amp;nbsp;can learn a thing or two from others' mistakes.&lt;br&gt;
&lt;br&gt;
&lt;u&gt;The mission:&lt;/u&gt; The data flow takes one table with duplicate rows and copies it
to another table and makes sure that every row will appear only once. In the way,
the data flow also adds some irrelevant fields. Among them is the Create_User and
Create_Date fields which tells by who and when the package last ran.&lt;br&gt;
&lt;u&gt;How my friends did it:&lt;/u&gt; Again, it's a very simple flow. They only added Derived
Column transformation to add the new fields and then they added an Aggregate transformation
to make every row appear only once. 
&lt;br&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationDataFlow.GIF" border=0&gt;
&lt;br&gt;
Note that this is not the real package. It's a sample I did on my machine to show
it here.&lt;br&gt;
&lt;br&gt;
&lt;u&gt;The Bug:&lt;/u&gt; When I first seen this it seemed to me very simple flow and I asked
myself how can it be that this is happening:&lt;br&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregation.GIF" border=0&gt;&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregation2.GIF" border=0&gt;
&lt;br&gt;
As you can see, it seems that the Aggregate transformation is not deterministic. Sometimes
it outputs 99 rows, sometimes 198 and in some other times I get other results as well.&lt;br&gt;
&lt;u&gt;Investigating:&lt;/u&gt; I wanted to see what's the difference between the table that
I got in the first time (99 rows) and the table I got in the second time (198 rows)
so I changed the destination table and compared the two tables. I ran "select * from
A where Column1+Column2+... not in (select Column1+Column2+... from B)"-style query
but it was no use - it showed me that there were no rows that appeared only in one
of the tables. In this step I really started to think (as my friends did) that maybe
the Aggregate transformation has something wrong inside... Instead of blaming Microsoft,
I decided to think. I needed to see what can make the flow non-deterministic. Then,
it hit me.&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationDerivedColumn.GIF" border=0&gt;&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonDeterministicAggregationAggregate.GIF" border=0&gt;
&lt;br&gt;
The only non-deterministic component in the flow is the Derived Column because it
has the getdate() function (it may be simple to see here, but in the original package
the derived column transformation had many fields). The results of this function may
differ in the milliseconds, especially for large tables. Then I looked in the Aggregate
transformation and seen that the Create_Date column also was in the Group by operation,
meaning that if two rows has different millisecond they will be placed twice in the
destination table, although they are the same in every column. That's it, the bug
was found. But still, one question remained: Why the query did not show me this? The
answer is also simple but tricky to find: In the comparison query I concatenated all
the columns in the tables in order to compare the results. When I did this, I casted
the Create_Date to nvarchar which truncated the milliseconds. 
&lt;p&gt;
&lt;/p&gt;
&lt;u&gt;Conclusions:&lt;/u&gt; 
&lt;ul&gt;
&lt;li&gt;
Pay attention to non-deterministic elements in what you do, whether it's code or ETL
process. 
&lt;li&gt;
When you do dummy stuff like checking all the checkboxes in a list - think what are
the outcomes. 
&lt;li&gt;
Call Miky when you're desperate.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=f590b1f7-4d99-4539-bf47-349c121fd431" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,f590b1f7-4d99-4539-bf47-349c121fd431.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
  </channel>
</rss>