<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SSIS Junkie : script component, ssis</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/tags/script+component/ssis/default.aspx</link><description>Tags: script component, ssis</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>SSIS: Script component debugging comes to SQL Server Integration Services 2012</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2011/10/14/ssis-script-component-debugging-comes-to-sql-server-integration-services-2012.aspx</link><pubDate>Fri, 14 Oct 2011 08:48:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:39042</guid><dc:creator>jamiet</dc:creator><slash:comments>3</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/39042.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=39042</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=39042</wfw:comment><description>&lt;p&gt;One of the biggest complaints I see developers raising about SSIS since it was released in 2005 is that the only way to debug Script Components is the distinctly simplistic and old fashioned method of sticking up message boxes - there&amp;nbsp;is no way to step through the code as it executes (something that Microsoft developers have generally&amp;nbsp;been able to&amp;nbsp;do for eons).&lt;/p&gt;&lt;p&gt;Happily that is no longer the case, or won't be soon anyway. In his session yesterday at the PASS Summit SSIS team member Matt Masson revealed that proper Script Component debugging (breakpoints, step into, step over, etc...) will be coming to SSIS 2012. Matt asked me to point out that nothing is certain, things may change before RTM blah blah blah but ostensibly SSIS developers can now sleep easy in the knowledge that message box debugging has gone away forever. Great news!&lt;/p&gt;&lt;p&gt;@jamiet&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=39042" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/denali/default.aspx">denali</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/script+component/default.aspx">script component</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/SQL+Server+2012/default.aspx">SQL Server 2012</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server+integration+services/default.aspx">sql server integration services</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/ssis/default.aspx">ssis</category></item><item><title>Don’t turn the dataflow into a cursor [SSIS]</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2010/08/31/don-t-turn-the-dataflow-into-a-cursor-ssis.aspx</link><pubDate>Tue, 31 Aug 2010 21:22:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:28477</guid><dc:creator>jamiet</dc:creator><slash:comments>9</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/28477.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=28477</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=28477</wfw:comment><description>&lt;p&gt;I saw a thread on the SSIS forum today that went something like this:&lt;/p&gt;  &lt;hr&gt;  &lt;blockquote&gt;   &lt;p&gt;I have the following dataset:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2"&gt;       &lt;tr&gt;         &lt;td&gt;AccountNo&lt;/td&gt;          &lt;td&gt;Date&lt;/td&gt;          &lt;td&gt;DailyMovement&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;28/08/2010&lt;/td&gt;          &lt;td&gt;10&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;29/08/2010&lt;/td&gt;          &lt;td&gt;5&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;30/08/2010&lt;/td&gt;          &lt;td&gt;7&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000002&lt;/td&gt;          &lt;td&gt;28/08/2010&lt;/td&gt;          &lt;td&gt;8&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000002&lt;/td&gt;          &lt;td&gt;29/08/2010&lt;/td&gt;          &lt;td&gt;6&lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt;    &lt;p&gt;for which I want to compute a running total per [AccountNo] &amp;amp; [Date] like so:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2"&gt;       &lt;tr&gt;         &lt;td&gt;AccountNo&lt;/td&gt;          &lt;td&gt;Date&lt;/td&gt;          &lt;td&gt;DailyMovement&lt;/td&gt;          &lt;td&gt;RunningTotal&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;28/08/2010&lt;/td&gt;          &lt;td&gt;10&lt;/td&gt;          &lt;td&gt;10&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;29/08/2010&lt;/td&gt;          &lt;td&gt;5&lt;/td&gt;          &lt;td&gt;15&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000001&lt;/td&gt;          &lt;td&gt;30/08/2010&lt;/td&gt;          &lt;td&gt;7&lt;/td&gt;          &lt;td&gt;22&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000002&lt;/td&gt;          &lt;td&gt;28/08/2010&lt;/td&gt;          &lt;td&gt;8&lt;/td&gt;          &lt;td&gt;8&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;00000002&lt;/td&gt;          &lt;td&gt;29/08/2010&lt;/td&gt;          &lt;td&gt;6&lt;/td&gt;          &lt;td&gt;14&lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt;    &lt;p&gt;How do I do that using a script component?&lt;/p&gt; &lt;/blockquote&gt;  &lt;hr&gt;  &lt;p&gt;That last comment:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;How do I do that using a script component?&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;is a fairly common question. People assume that if a calculated value is dependant on prior rows then a script component needs to be involved because that running total needs to be tracked somewhere, but that isn’t necessarily the case. Ask yourself, how would you do this if the data were residing in a database table, would you do this?:&lt;code style="font-size:12px;"&gt;&lt;span style="color:black;"&gt;&lt;/span&gt;      &lt;/code&gt;&lt;/p&gt;&lt;code style="font-size:12px;"&gt;&lt;blockquote&gt;&lt;font size="2"&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:red;"&gt;'00000001' &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;date&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'20080828'&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;10 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;INTO&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:#434343;"&gt;#balances            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;UNION&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;ALL            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:red;"&gt;'00000001' &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;date&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'20080829'&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;5 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;UNION&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;ALL            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:red;"&gt;'00000001' &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;date&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'20080830'&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;7 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;UNION&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;ALL            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:red;"&gt;'00000002' &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;date&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'20080828'&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;8 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;UNION&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;ALL            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:red;"&gt;'00000002' &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;date&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'20080829'&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;6 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[AccountNo]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[Date]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp; &lt;/span&gt;&lt;span style="color:magenta;"&gt;SUM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;DailyMovement&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;)            &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#434343;"&gt;#balances &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b2            &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;b1.[AccountNo] &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b2.[AccountNo]            &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;b1.[Date] &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;b2.[Date]&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:gray;"&gt;)            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#434343;"&gt;#balances &lt;/span&gt;&lt;span style="color:black;"&gt;b1;&lt;/span&gt;&lt;/font&gt;&lt;/blockquote&gt;   &lt;/code&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;OK that works, and here’s a screenshot to prove it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_57F5D682.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" width="469" height="200" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_556CA4C4.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;But really, would any of you actually &lt;i&gt;do&lt;/i&gt; this? Hopefully not, the use of the &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Correlated_subquery"&gt;correlated subquery&lt;/a&gt; has simply turned what should be a nice set operation into a cursor-in-disguise (something I have &lt;a target="_blank" href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/05/14/inequality-joins-asynchronous-transformations-and-lookups-ssis.aspx"&gt;talked about before&lt;/a&gt;) because that subquery will be getting executed for every row in the table. Instead you could run the following on that same dataset:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;&lt;font size="2"&gt;SELECT &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b1.[AccountNo]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b1.[Date]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b1.[DailyMovement]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:magenta;"&gt;SUM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;b2.[DailyMovement]&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;[RunningTotal]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#434343;"&gt;#balances &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b1            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;INNER&amp;nbsp; JOIN &lt;/span&gt;&lt;span style="color:#434343;"&gt;#balances &lt;/span&gt;&lt;span style="color:black;"&gt;b2 &lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;b1.[AccountNo] &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b2.[AccountNo]            &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;AND &lt;/span&gt;&lt;span style="color:black;"&gt;b1.[Date] &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;= &lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color:black;"&gt;b2.[Date]            &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;GROUP&amp;nbsp; BY &lt;/span&gt;&lt;span style="color:black;"&gt;b1.[AccountNo]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;b1.[Date]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;b1.[DailyMovement]&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;and you get the same result but with a much more amenable execution plan (execute with &lt;code style="font-size:12px;"&gt;&lt;font size="2"&gt;&lt;span style="color:blue;"&gt;SET STATISTICS &lt;/span&gt;&lt;span style="color:black;"&gt;IO &lt;/span&gt;&lt;span style="color:blue;"&gt;ON&lt;/span&gt;&lt;/font&gt;&lt;/code&gt; if you don’t believe me)!&lt;/p&gt;  &lt;p&gt;The same principle applies in a SSIS dataflow. Often there is no need to resort to a script component, the same result can be achieved using some smart dataflow design. You can use, for example, the same approach as in the second SQL query (above) using a combination of SSIS’ Sort, Aggregate, Merge Join and Conditional Split components. That is not to say that one will be quicker than the other but at least you’ll have something that is more intuitive and arguably more maintainable. Of course if performance gain is your primary goal then the correct advice is, as always, “test and measure, test and measure, test and measure”!!!&lt;/p&gt;  &lt;p&gt;Ask yourself “If I could, how would I solve this using T-SQL?” and see if that influences your dataflow design at all. Invariably script components should be the &lt;i&gt;last&lt;/i&gt; choice, not the first!&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://twitter.com/jamiet"&gt;@jamiet&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=28477" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/dataflow/default.aspx">dataflow</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/script+component/default.aspx">script component</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server+integration+services/default.aspx">sql server integration services</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/ssis/default.aspx">ssis</category></item></channel></rss>