<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>SSIS Junkie</title><link>http://sqlblog.com/blogs/jamie_thomson/default.aspx</link><description>Freelance SQL Server developer in London
</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jamiet" /><feedburner:info uri="jamiet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>PBM for SSIS? What policies would you want?</title><link>http://feedproxy.google.com/~r/jamiet/~3/EWPzAfboT08/pbm-for-ssis-what-policies-would-you-want-or-need.aspx</link><pubDate>Thu, 09 Feb 2012 13:50:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41649</guid><dc:creator>jamiet</dc:creator><slash:comments>2</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41649.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41649</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41649</wfw:comment><description>&lt;p&gt;My mind was wandering today after reading Andy Leonard's excellent post &lt;a href="http://sqlblog.com/blogs/andy_leonard/archive/2012/02/09/ssis-snack-name-those-connections.aspx" target="_blank"&gt;Name Those Connections&lt;/a&gt; and it occurred to me that due to SQL Server 2012 including an &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/11/13/ssis-server-catalogs-environments-environment-variables-in-ssis-in-denali.aspx" target="_blank"&gt;SSIS Server&lt;/a&gt; there may be an opportunity to leverage &lt;a href="http://msdn.microsoft.com/en-us/library/bb510667.aspx" target="_blank"&gt;Policy-Based Management&lt;/a&gt; (PBM) for ensuring adherance to an organisation's best practises around SSIS development. I have absolutely no idea whether such plans are afoot or not (I suspect not) but nonetheless it may be fun to come up with a desired list of policies. Here are some brainstormed ideas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;All task and package names have to adhere to some naming convention (&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/29/suggested-best-practises-and-naming-conventions.aspx" target="_blank"&gt;here are some suggestions&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;All executions need to use an environment reference&lt;/li&gt;&lt;li&gt;All Connection Managers must be project-scoped&lt;/li&gt;&lt;li&gt;All connection strings must use an Application Name that is not a GUID (this is where this train of thought started after reading Andy's post)&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Any more ideas? Pop 'em in the comments below!&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41649" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/EWPzAfboT08" height="1" width="1"/&gt;</description><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><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/PBM/default.aspx">PBM</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/02/09/pbm-for-ssis-what-policies-would-you-want-or-need.aspx</feedburner:origLink></item><item><title>SQLBits now publishing all SQLBits agendas as an iCalendar</title><link>http://feedproxy.google.com/~r/jamiet/~3/6yqxlzWKRXk/sqlbits-now-publishing-the-sqlbits-agenda-as-an-icalendar.aspx</link><pubDate>Wed, 08 Feb 2012 08:36:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41613</guid><dc:creator>jamiet</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41613.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41613</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41613</wfw:comment><description>&lt;p&gt;Three weeks ago I published a blog post &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/18/sqlbits-agenda-available-on-your-phone.aspx" target="_blank"&gt;Get the SQLBits agenda in your phone's calendar&lt;/a&gt; where I said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;If you want to get the SQLBits calendar onto your smartphone then the 
easiest way to do it is add my calendar [containing all SQLBits sessions] to whichever calendar service 
(i.e. Hotmail or Google) you have got synced to your phone and let 
technology do its thing.&lt;br&gt;I will keep the calendar updated with any changes to the agenda so, 
assuming you have subscribed, changes will just propogate to you without
 you having to do anything.&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not the first time I have published a subscribable calendar (&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/05/25/subscribable-world-cup-2010-calendar.aspx" target="_blank"&gt;I did it for the 2010 World Cup&lt;/a&gt; for example, I also &lt;a href="http://jamiekt.wordpress.com/2010/10/14/announcing-the-sunbury-on-thames-hub-on-elmcity/" target="_blank"&gt;curate a calendar for my home town&lt;/a&gt;) nor the first time I have &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/tags/iCalendar/default.aspx" target="_blank"&gt;opined&lt;/a&gt; &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/06/03/thinking-differently-about-bi-delivery.aspx" target="_blank"&gt;about&lt;/a&gt; &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/06/03/thinking-differently-about-bi-delivery.aspx" target="_blank"&gt;them&lt;/a&gt;. The reason I bang on about subscribable calendars (aka iCalendars) all the time is that I truly believe that they are a transformative technology. In my humble opinion &lt;b&gt;the world would be a better place if it ran on iCalendar &lt;/b&gt;and I'm not the only one who thinks so, Scott Adams (yes, &lt;a href="http://dilbert.com/about" target="_blank"&gt;THAT Scott Adams&lt;/a&gt;) says the same (but in a much more coherent way) in his blog post &lt;a href="http://dilbert.com/blog/entry/calendar_as_filter/" target="_blank"&gt;Calendar as Filter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My super-smart former colleague Howard van Rooijen is fond of saying &lt;a href="http://blog.endjin.com/2010/10/work-smarter-not-harder/" target="_blank"&gt;work smarter, not harder&lt;/a&gt; and, to me, subscribable calendars are the epitome of that mantra. Why should many people do the same work of downloading .ics files and importing them to their own calendar service when the content owner can simply make that information available to anyone? That is my motivation for publishing these subscribable calendars - I want to motivate the content owners to publish this information for themselves. &lt;/p&gt;

&lt;p&gt;With that in mind I am delighted to tell you that the SQLBits organising committee have taken this on board and published the SQLBits agenda as an iCalendar. One benefit of that is I don't have to go through the rigmarole of keeping my own calendar up to date but more importantly any changes to the SQLBits agenda (e.g. a room change) will &lt;i&gt;automatically flow to your own calendar service&lt;/i&gt; and if you have that calendar service (e.g. Hotmail Calendar, Google Calendar) synced to your phone then the changes will automatically show up there too. Very cool!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;That new SQLBits subscribable calendar lives at &lt;a href="http://sqlbits.com/information/SQLBitsCalendar.ashx" target="_blank"&gt;&lt;font face="Calibri,sans-serif" size="2"&gt;&lt;span style="font-size:11pt;"&gt;http://sqlbits.com/information/SQLBitsCalendar.ashx&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;; note how it is not specific to a particular conference - subscribe to (don't import) that calendar and the agenda for future SQLBits conferences will automatically flow to you too. Want to subscribe to that calendar yourself? Click one of the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you use Hotmail, click &lt;a href="http://calendar.live.com/calendar/calendar.aspx?rru=addsubscription&amp;amp;url=webcals://sqlbits.com/information/SQLBitsCalendar.ashx&amp;amp;name=SQLBits" target="_blank"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you use GMail/Google Calendar, click &lt;a href="http://www.google.com/calendar/render?cid=http://sqlbits.com/information/SQLBitsCalendar.ashx" target="_blank"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;N.B. I am assuming that Hotmail &amp;amp; Google Calendar covers the majority of folks that are going to be reading this. If you use a different service (e.g. Yahoo) then perhaps you could find out what the appropriate link should be and it as a comment below.&lt;/i&gt;&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You may also want to unsubscribe from &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/18/sqlbits-agenda-available-on-your-phone.aspx" target="_blank"&gt;my calendar&lt;/a&gt; because I am no longer going to keep it updated.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;My thanks go to the SQLBits committee for doing this; more accurately the thanks should go to &lt;a href="http://sqlblogcasts.com/blogs/simons/" target="_blank"&gt;Simon Sabin&lt;/a&gt; because it was he that made this happen.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;P.S. If you agree with me that iCalendar is a transformative technology and would like to get involved then take a look at Jon Udell's &lt;a href="http://blog.jonudell.net/elmcity-project-faq/" target="_blank"&gt;Elmcity project&lt;/a&gt; (&lt;a href="http://blog.jonudell.net/elmcity-project-faq/" target="_blank"&gt;FAQ&lt;/a&gt;) to curate your own calendar for your home town.&lt;/p&gt;&lt;p&gt;UPDATE: Some folks are saying that the link to Google Calendar produces the message: "&lt;i&gt;You do not have access to &amp;lt;the calendar&amp;gt;&lt;/i&gt;". The exact same problem was reported with the calendar that I produced three weeks ago so I am assuming that the problem is at Google's end. The workaround is to subscribe to URL&amp;nbsp; &lt;a href="http://sqlbits.com/information/SQLBitsCalendar.ashx" target="_blank"&gt;&lt;font face="Calibri,sans-serif" size="2"&gt;&lt;span style="font-size:11pt;"&gt;http://sqlbits.com/information/SQLBitsCalendar.ashx&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; in Google Calendar by clicking Other calendars-&amp;gt;Add by URL.&lt;/p&gt;
&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/18/sqlbits-agenda-available-on-your-phone.aspx" target="_blank"&gt;&lt;/a&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41613" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/6yqxlzWKRXk" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/SQLBits/default.aspx">SQLBits</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/iCalendar/default.aspx">iCalendar</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/02/08/sqlbits-now-publishing-the-sqlbits-agenda-as-an-icalendar.aspx</feedburner:origLink></item><item><title>Suggested Best Practises and naming conventions</title><link>http://feedproxy.google.com/~r/jamiet/~3/H6WJ-98MwYY/suggested-best-practises-and-naming-conventions.aspx</link><pubDate>Sun, 29 Jan 2012 18:08:53 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41417</guid><dc:creator>jamiet</dc:creator><slash:comments>9</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41417.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41417</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41417</wfw:comment><description>&lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;Once upon a time I blogged at &lt;a href="http://consultingblogs.emc.com/jamiethomson"&gt;http://consultingblogs.emc.com/jamiethomson&lt;/a&gt; but that ended in August 2009 when I left EMC. There is a lot of (arguably) valuable content over there however certain events in the past leave me concerned that that content is not well cared for and I don't have any confidence that it will still exist in the long term. Hence, I have taken the decision to re-publish some of that content here at SQLBlog so over the coming weeks and months you may find re-published content popping up here from time-to-time.&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;This is the third such blog post in which I suggest some best practises and naming conventions that you may choose to employ and which was originally published &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2006/01/05/SSIS_3A00_-Suggested-Best-Practices-and-naming-conventions.aspx" target="_blank"&gt;here&lt;/a&gt; (I have changed it slightly since then – spotters badge if you can find the differences!). The first post in &lt;/em&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/tags/repost/default.aspx"&gt;&lt;em&gt;this series&lt;/em&gt;&lt;/a&gt;&lt;em&gt; can be found at &lt;/em&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/08/19/ssis-onpipelinerowssent-event.aspx"&gt;&lt;em&gt;[SSIS] OnPipelineRowsSent&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and the second at &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/10/25/ssis-dataflow-mechanics.aspx" target="_blank"&gt;Dataflow mechanics&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;hr /&gt;  &lt;p&gt;I thought it would be worth publishing a list of guidelines that I see as SSIS development best practices. These are my own opinions and are based upon my experience of using SSIS over the past 18 months. I am not saying you should take them as gospel but these are generally tried and tested methods and if nothing else should serve as a basis for you developing your own SSIS best practices.&lt;/p&gt;  &lt;p&gt;One thing I really would like to see getting adopted is a common naming convention for tasks and components and to that end I have published some suggestions at the bottom of this post.&lt;/p&gt;  &lt;p&gt;This list will get added to over time so if you find this useful keep checking back here to see updates!&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If you know that data in a source is sorted, set IsSorted=TRUE on the source adapter output. This may save unnecessary SORTs later in the pipeline which can be expensive. Setting this value does not perform a sort operation, it only indicates that the data it sorted. &lt;/li&gt;    &lt;li&gt;Rename all Name and Description properties from the default. This will help when debugging particularly if the person doing the debugging is not the person that built the package. &lt;/li&gt;    &lt;li&gt;Only select columns that you need in the pipeline to reduce buffer size and reduce OnWarning events at execution time &lt;/li&gt;    &lt;li&gt;Following on from the previous bullet point, always use a SQL statement in an OLE DB Source component or LOOKUP component rather than just selecting a table. Selecting a table is akin to &amp;quot;SELECT *...&amp;quot; which is universally recognised as bad practice. (&lt;a href="http://www.sqljunkies.com/WebLog/simons/archive/2006/01/20/17865.aspx"&gt;http://www.sqljunkies.com/WebLog/simons/archive/2006/01/20/17865.aspx&lt;/a&gt;). In certain scenarios the approach of using a SQL statement can result in much improved performance as well (&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2006/02/21/2930.aspx"&gt;http://blogs.conchango.com/jamiethomson/archive/2006/02/21/2930.aspx&lt;/a&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strike&gt;Use SQL Server Destination as opposed to OLE DB Destination where possible for quicker insertions&lt;/strike&gt; I used to recommend using SQL Server Destinations wherever possible but I've changed my mind. Experience from around the community suggests that the difference in performance between SQL Server Destination and OLE DB Destination is negligible and hence, given the flexibility of packages that use OLE DB Destinations it may be better to go for the latter. Its an &amp;quot;it depends&amp;quot; consideration so you should consider what you prefer based on your own testing. &lt;/li&gt;    &lt;li&gt;Use Sequence containers to organise package structure into logical units of work. This makes it easier to identify what the package does and also helps to control distributed transactions if they are being implemented. &lt;/li&gt;    &lt;li&gt;Where possible, use expressions on the SQLStatementType property of the Execute SQL Task instead of parameterised SQL statements. This removes ambiguity when different OLE DB providers are being used. It is also easier. (UPDATE: There is a caveat here. Results of expressions are limited to 4000 characters so be wary of this if using expressions). &lt;/li&gt;    &lt;li&gt;Use caching in your LOOKUP components where possible. It makes them quicker. Watch that you are not grabbing too many resources when you do this though. &lt;/li&gt;    &lt;li&gt;LOOKUP components will generally work quicker than MERGE JOIN components where the 2 can be used for the same task (&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2005/10/21/2289.aspx"&gt;http://blogs.conchango.com/jamiethomson/archive/2005/10/21/2289.aspx&lt;/a&gt;). Note that this is not always the case so test and measure, test and measure, test and measure! &lt;/li&gt;    &lt;li&gt;Always use DTExec to perf test your packages. This is not the same as executing without debugging from SSIS Designer (&lt;a href="http://www.sqlis.com/default.aspx?84"&gt;http://www.sqlis.com/default.aspx?84&lt;/a&gt;). &lt;/li&gt;    &lt;li&gt;Use naming conventions for your tasks and components. I suggest using acronyms at the start of the name and there are some suggestions for these acronyms at the end of this article. This approach does not help a great deal at design-time where the tasks and components are easily identifiable but can be invaluable at debug-time and run-time.&amp;#160; e.g. My suggested acronym for a Data Flow Task is &lt;strong&gt;DFT&lt;/strong&gt; so the name of a data flow task that populates a table called MyTable could be &amp;quot;&lt;strong&gt;DFT Load MyTable&amp;quot;.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;If you want to conditionally execute a task at runtime use expressions on your precedence constraints. Do not use an expression on the &amp;quot;Disable&amp;quot; property of the task. &lt;/li&gt;    &lt;li&gt;Don't pull all configurations into a single XML configuration file. Instead, put each configuration into a seperate XML configuration file. This is a more modular approach and means that configuration files can be reused by different packages more easily. &lt;/li&gt;    &lt;li&gt;If you need a dynamic SQL statement in an OLE DB Source component, set AccessMode=&amp;quot;SQL Command from variable&amp;quot; and build the SQL statement in a variable that has EvaluateAsExpression=TRUE. (&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2005/12/09/2480.aspx"&gt;http://blogs.conchango.com/jamiethomson/archive/2005/12/09/2480.aspx&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;When using checkpoints, use an expression to populate the CheckpointFilename property which will allow you to include the value returned from System::PackageName in the checkpoint filename. This will allow you to easily identify which package a checkpoint file is to be used by. &lt;/li&gt;    &lt;li&gt;When using raw files and your Raw File Source Component and Raw File Destination Component are in the same package, configure your Raw File Source and Raw File Destination to get the name of the raw file from a variable. This will avoid hardcoding the name of the raw file into the two seperate components and running the risk that one may change and not the other. &lt;/li&gt;    &lt;li&gt;Variables that contain the name of a raw file should be set using an expression. This will allow you to include the value returned from System::PackageName in the raw file name. This will allow you to easily identify which package a raw file is to be used by. N.B. This approach will only work if the Raw File Source Component and Raw File Destination Component are in the same package. &lt;/li&gt;    &lt;li&gt;Use a common folder structure (&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2006/01/05/2559.aspx"&gt;http://blogs.conchango.com/jamiethomson/archive/2006/01/05/2559.aspx&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;Use variables to store your expressions (&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2005/12/05/2462.aspx"&gt;http://blogs.conchango.com/jamiethomson/archive/2005/12/05/2462.aspx&lt;/a&gt;). This allows them to be shared by different objects and also means you can view the values in them at debug-time using the Watch window. &lt;/li&gt;    &lt;li&gt;Keep your packages in the dark (&lt;a href="http://www.windowsitpro.com/SQLServer/Article/ArticleID/47688/SQLServer_47688.html"&gt;http://www.windowsitpro.com/SQLServer/Article/ArticleID/47688/SQLServer_47688.html&lt;/a&gt;). In summary, this means that you should make your packages location unaware. This makes it easier to move them across environments. &lt;/li&gt;    &lt;li&gt;If you can, filter your data in the Source Adapter rather than filter the data using a Conditional Split transform component. This will make your data flow perform quicker. &lt;/li&gt;    &lt;li&gt;When storing information about an OLE DB Connection Manager in a configuration, don't store the individual properties such as Initial Catalog, Username, Password etc... just store the ConnectionString property. &lt;/li&gt;    &lt;li&gt;Your variables should only be scoped to the &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2004/12/13/445.aspx"&gt;containers&lt;/a&gt; in which they are used. Do not scope all your variables to the &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2005/07/13/1792.aspx"&gt;package container&lt;/a&gt; if they don't need to be. &lt;/li&gt;    &lt;li&gt;Employ &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2006/11/08/SSIS_3A00_-Package-Naming-Conventions.aspx"&gt;namespaces for your packages&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Make log file names dynamic so that you get a new logfile for each execution. &lt;/li&gt;    &lt;li&gt;Use ProtectionLevel=DontSaveSensitive. Other developers will not be restricted from opening your packages and you will be forced to use configurations (which is another recommended best practice) &lt;/li&gt;    &lt;li&gt;Use annotations wherever possible. At the very least each data-flow should contain an annotation. &lt;/li&gt;    &lt;li&gt;Always log to a text file, even if you are logging elsewhere as well. Logging to a text file has less reliance on external factors and is therefore most likely to contain all information required for debugging. &lt;/li&gt;    &lt;li&gt;Create a new solution folder in Visual Studio Solution Explorer in order to store your configuration files. Or, store them in the 'miscellaneous files' section of a project. &lt;/li&gt;    &lt;li&gt;Always use &lt;a href="http://blogs.conchango.com/jamiethomson/archive/tags/ssis/template/default.aspx"&gt;template packages&lt;/a&gt; to standardise on logging, event handling and configuration. &lt;/li&gt;    &lt;li&gt;If your template package contains variables put them in a dedicated namespace called &amp;quot;template&amp;quot; in order to differentiate them from variables that are added later. &lt;/li&gt;    &lt;li&gt;Break out all tasks requiring the Jet engine (Excel or Access data sources) into their own packages that do nothing but that data flow task. Load the data into Staging tables if necessary. This will ensure that solutions can be migrated to 64bit with no rework. &lt;/li&gt;    &lt;li&gt;Don't include connection-specific info (such as server names, database names or file locations) in the names of your connection managers. For example, &amp;quot;OrderHistorySystem&amp;quot; is a better name than &amp;quot;Svr123ABC\OrderHist.dbo&amp;quot;. &lt;/li&gt; &lt;/ol&gt;  &lt;hr /&gt;The acronyms below can be used at the beginning of the names of tasks to identify what type of task it is.   &lt;table style="width:271pt;border-collapse:collapse;margin-left:4.65pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="MsoNormalTable" cellspacing="0" cellpadding="0"&gt;     &lt;tr style="height:15pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:#550d2a;height:15pt;border-top:windowtext 1pt solid;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:white;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Task&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;padding-left:5.4pt;width:101pt;padding-right:5.4pt;background:#550d2a;height:15pt;border-left-color:windowtext;border-top:windowtext 1pt solid;border-left-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:white;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Prefix&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:1;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;For Loop Container&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FLC&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:2;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Foreach&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt; Loop Container&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FELC&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:3;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Sequence Container&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SEQC&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:4;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;ActiveX Script&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;AXS&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:5;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Analysis Services Execute DDL&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;ASE&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:6;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Analysis Services Processing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;ASP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:7;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Bulk Insert&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;BLK&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:8;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Data Flow&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DFT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:9;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Data Mining Query&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DMQ&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:10;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Execute DTS 2000 Package&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EDPT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:11;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Execute Package&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EPT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:12;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Execute Process&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EPR&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:13;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Execute SQL&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SQL&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:14;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;File System&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FSYS&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:15;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FTP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FTP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:16;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Message Queue&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;MSMQ&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:17;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Script&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SCR&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:18;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Send Mail&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SMT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:19;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer Database&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TDB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:20;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer Error Messages&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TEM&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:21;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer Jobs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TJT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:22;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer Logins&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TLT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:23;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer Master Stored Procedures&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TSP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:24;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Transfer SQL Server Objects&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TSO&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:25;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Web Service&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;WST&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:26;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;WMI Data Reader&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;WMID&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:27;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;WMI Event Watcher&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;WMIE&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="height:15pt;mso-yfti-irow:28;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:170pt;padding-right:5.4pt;background:white;border-top-width:1pt;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;XML&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:101pt;padding-right:5.4pt;border-top-style:none;background:white;height:15pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="line-height:normal;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;XML&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;These acronyms should be used at the beginning of the names of components to identify what type of component it is. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table&gt;     &lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;background:#550d2a;border-top:windowtext 1pt solid;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:white;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Component&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;background:#550d2a;border-left-color:windowtext;border-top:windowtext 1pt solid;border-left-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:white;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Prefix&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:1;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DataReader&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt; Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DR_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:2;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Excel Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EX_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:3;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Flat File Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FF_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:4;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;OLE DB Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;OLE_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:5;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Raw File Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;RF_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:6;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;XML Source&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;XML_SRC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:7;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Aggregate&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;AGG&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:8;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Audit&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;AUD&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:9;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Character Map&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;CHM&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:10;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Conditional Split&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;CSPL&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:11;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Copy Column&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;CPYC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:12;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Data Conversion&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DCNV&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:13;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Data Mining Query&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DMQ&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:14;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Derived Column&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DER&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:15;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Export Column&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EXPC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:16;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Fuzzy Grouping&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FZG&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:17;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Fuzzy Lookup&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FZL&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:18;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Import Column&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;IMPC&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:19;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Lookup&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;LKP&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:20;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Merge&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;MRG&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:21;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Merge Join&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;MRGJ&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:22;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Multicast&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;MLT&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:23;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;OLE DB Command&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;CMD&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:24;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Percentage Sampling&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;PSMP&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:25;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Pivot&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;PVT&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:26;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Row Count&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;CNT&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:27;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Row Sampling&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;RSMP&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:28;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Script Component&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SCR&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:29;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Slowly Changing Dimension&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SCD&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:30;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Sort&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SRT&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:31;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Term Extraction&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TEX&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:32;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Term Lookup&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;TEL&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:33;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Union All&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;ALL&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:34;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Unpivot&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;UPVT&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:35;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Data Mining Model Training&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DMMT_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:36;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DataReader&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt; Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DR_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:37;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Dimension Processing&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;DP_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:38;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Excel Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;EX_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:39;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Flat File Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;FF_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:40;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;OLE DB Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;OLE_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:41;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Partition Processing&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;PP_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:42;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Raw File Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;RF_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:43;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;Recordset&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt; Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;RS_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:44;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SQL Server Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SS_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:45;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:windowtext 1pt solid;border-left:windowtext 1pt solid;padding-bottom:0cm;border-top-color:windowtext;padding-left:5.4pt;width:195.05pt;padding-right:5.4pt;border-top-width:1pt;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SQL Server Mobile Destination&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:windowtext 1pt solid;padding-bottom:0cm;border-left-style:none;padding-left:5.4pt;width:224.95pt;padding-right:5.4pt;border-top-style:none;border-right:windowtext 1pt solid;padding-top:0cm;"&gt;         &lt;p style="text-align:justify;line-height:15pt;margin-bottom:0pt;" class="MsoNormal"&gt;&lt;span style="font-family:'Arial','sans-serif';color:black;font-size:10pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;SSM_DST&lt;/span&gt;&lt;span style="font-family:'Times New Roman','serif';color:black;font-size:12pt;mso-fareast-font-family:'Times New Roman';mso-fareast-language:en-gb;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41417" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/H6WJ-98MwYY" height="1" width="1"/&gt;</description><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><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/naming+conventions/default.aspx">naming conventions</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/repost/default.aspx">repost</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/29/suggested-best-practises-and-naming-conventions.aspx</feedburner:origLink></item><item><title>Thoughts on Test Driven Database Development</title><link>http://feedproxy.google.com/~r/jamiet/~3/9zJ8JUgKpVQ/thoughts-on-test-driven-database-development.aspx</link><pubDate>Thu, 26 Jan 2012 08:30:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41327</guid><dc:creator>jamiet</dc:creator><slash:comments>11</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41327.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41327</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41327</wfw:comment><description>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"&gt;Test-Driven Development (TDD)&lt;/a&gt; is a software development practise that has been around for a few years. Wikipedia describes it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Test-driven development (TDD) is a &lt;a href="http://en.wikipedia.org/wiki/Software_development_process" title="Software development process"&gt;software development process&lt;/a&gt; that relies on the repetition of a very short development cycle: first the developer writes a failing automated &lt;a href="http://en.wikipedia.org/wiki/Test_case" title="Test case"&gt;test case&lt;/a&gt; that defines a desired improvement or new function, then produces code to pass that test and finally &lt;a href="http://en.wikipedia.org/wiki/Code_refactoring" title="Code refactoring"&gt;refactors&lt;/a&gt; the new code to acceptable standards. &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck" title="Kent Beck"&gt;Kent Beck&lt;/a&gt;,
 who is credited with having developed or 'rediscovered' the technique, 
stated in 2003 that TDD encourages simple designs and inspires 
confidence.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"&gt;http://en.wikipedia.org/wiki/Test-driven_development&lt;/a&gt;&lt;/i&gt;&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since 2003 TDD practises have seen refinements such as &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" target="_blank"&gt;Behavior-Driven Development&lt;/a&gt; and &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd" target="_blank"&gt;Uncle Bob's Three Rules of TDD&lt;/a&gt;, all the while TDD has pretty much become an accepted way of developing quality software. Accepted that is everywhere outside of the database development arena and that is the arena in which I spend my working life. TDD simply has not, in my opinion, caught on with database developers like it has our appdev brethren and I was reminded of this yesterday when &lt;a href="https://twitter.com/#%21/atulthakor" target="_blank"&gt;Atul Thakor&lt;/a&gt; asked on Twitter:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;anyone done TDD for database development and would they recommend it?&lt;/i&gt; &lt;i&gt;&lt;br&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&lt;a href="https://twitter.com/#%21/atulthakor/status/161886007929733120" target="_blank"&gt;https://twitter.com/#!/atulthakor/status/161886007929733120&lt;/a&gt;&lt;/i&gt;&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To which my answer was an emphatic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;(1) yes &amp;amp; (2) absolutely, yes&lt;/i&gt;&lt;/p&gt;
&lt;i&gt;&lt;a href="https://twitter.com/#%21/jamiet/status/161894215217987585" target="_blank"&gt;https://twitter.com/#!/jamiet/status/161894215217987585&lt;/a&gt;&lt;/i&gt;&lt;/blockquote&gt;

&lt;p&gt;I'll use this blog post to expand on that outside of 140 characters.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;In October 2010 I undertook a mini-project for the client I was working for at the time (a bank) where a colleague and I were tasked with building the database portion of a system that would support reconciliation of our ETL processes. It was a nice piece of work in that it was small, well-scoped, time-bound, greenfield, did not have any external dependancies and had a technically savvy product owner. We sat down at the start and decided that this was an ideal opportunity to trial TDD as a method of developing a database; I would write the failing tests and my colleague would make the tests pass. We came up with some guiding principles and, although we didn't know it at the time, they were pretty close to Uncle Bob's three rules.&lt;/p&gt;

&lt;p&gt;I used Visual Studio 2010's &lt;a href="http://msdn.microsoft.com/en-us/library/bb381703%28v=vs.80%29.aspx" target="_blank"&gt;database unit testing framework&lt;/a&gt;&lt;sup&gt;1&lt;/sup&gt; to write my tests and have them run as part of our Continuous Integration (CI) build (see &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/08/20/setting-up-database-unit-testing-as-part-of-a-continuous-integration-build-process-vs2010-db-tools-datadude.aspx" target="_blank"&gt;Setting up database unit testing as part of a Continuous Integration build process&lt;/a&gt;). I would write the tests, check-in, the CI build would fail and my colleague would "get latest" in order to see what code he had to write to stop the build from failing. To cut a long story short the use of TDD was considered to be a great success; we shipped a working system on time/on budget and moreover, &lt;i&gt;&lt;b&gt;even though I didn't write a scrap of code that went into production I have never had more confidence that a system I was involved in building worked as intended&lt;/b&gt;&lt;/i&gt;. That's quite a statement. My confidence stemmed from the fact that as the test author I was ultimately responsible for ensuring that the system did what it was supposed to; I could qualify my confidence by pointing at our CI build and highlighting the number of tests that were passing and how that number had steadily increased as the project progressed.&lt;/p&gt;&lt;p&gt;By the time the project had finished the database consisted of (if memory serves me correctly) 6 tables and about 10 stored procedures or functions (so yes, very small). To test that we had roughly 70 tests that were getting run up to 20 times a day. The project had taken about two months from start-up to final delivery - you can make your own opinions as to whether you consider that prompt or tardy but our product owner was happy and that's pretty much all that counted as far as I was concerned.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Since that project I have moved onto other clients and at each one I have always extolled the use of database unit testing; we haven't always practised TDD but at each one we &lt;i&gt;have &lt;/i&gt;been writing database unit tests and in the future I suspect that a client's willingness (or lack thereof) to use database unit testing will be a major factor in influencing whether we end up working together or not.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Are you a database developer doing database unit testing or perhaps even TDD? Let me know in the comments, I'd love to hear about others' experiences.&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@jamiet&lt;/a&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt;Yes, that linked-to article from &lt;u&gt;7 years ago&lt;/u&gt; is the best one I 
could find to describe what Visual Studio's Database Unit testing Framework actually is - sort it out Microsoft!&lt;/p&gt;&lt;p&gt;UPDATE: I have just remembered that Jamie Laflen has written an excellent whitepaper entitled &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc164243.aspx" target="_blank"&gt;Apply Test-Driven Development to your Database Projects&lt;/a&gt; that goes into much more detail about how to achieve database TDD using Visual Studio than I have here. Well worth a read. &lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41327" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/9zJ8JUgKpVQ" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Datadude/default.aspx">Datadude</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/unit+testing/default.aspx">unit testing</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/DBPro/default.aspx">DBPro</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Test-Driven+Development/default.aspx">Test-Driven Development</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/TDD/default.aspx">TDD</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/agile/default.aspx">agile</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/26/thoughts-on-test-driven-database-development.aspx</feedburner:origLink></item><item><title>Whatever happened to Twitter Annotations?</title><link>http://feedproxy.google.com/~r/jamiet/~3/IrN-l46cghg/whatever-happened-to-twitter-annotations.aspx</link><pubDate>Wed, 25 Jan 2012 09:46:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41296</guid><dc:creator>jamiet</dc:creator><slash:comments>3</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41296.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41296</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41296</wfw:comment><description>&lt;p&gt;In April 2010 Twitter announced a new feature that they would soon be introducing - Twitter Annotations. Put simply Twitter Annotations can be described as the ability to attach metadata to a tweet; think hashtags on steroids. Lots of people were quite excited about it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;I love to sit on the beach. &amp;nbsp;One of the coolest things about the 
beach is the number of layers of visual depth. &amp;nbsp;Look at the sand and 
it's beautiful, but zoom your eyes in closer and you'll see a whole 
layer of life running around on the sand that you didn't see before. 
&amp;nbsp;Look even closer and you can see individual grains of sand, water and 
light dancing between them. &amp;nbsp;Look closer still and you see that each 
grain of sand is a unique object with its own texture. &amp;nbsp;If your eyes are
 strong enough, or you have a machine to help you, you can see even more
 layers by looking closer still.

That's what Twitter is going to be like with the launch of Twitter 
Annotations this Summer.  It's a beautiful vision, with huge potential&lt;a href="http://www.readwriteweb.com/archives/what_twitter_annotations_mean.php" target="_blank"&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href="http://www.readwriteweb.com/archives/what_twitter_annotations_mean.php" target="_blank"&gt;What Twitter Annotations mean by Marshall Kirkpatrick&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Today at the Twitter Chirp Hack Day I talked with a ton of developers and
 the new feature they were most interested in. Adam Jackson echoed 
everyone I’ve heard today when &lt;a href="http://twitter.com/adamjackson/statuses/12180272857"&gt;he tweeted &lt;/a&gt;“Twitter Annotations is what I’ve been wanting FOREVER.”&lt;a href="http://scobleizer.com/2010/04/15/twitter-annotations/" target="_blank"&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href="http://scobleizer.com/2010/04/15/twitter-annotations/" target="_blank"&gt;Developers: how will we all get along with Twitter’s annotation feature? by Robert Scoble&lt;/a&gt;&lt;br&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Twitter announced a series of new features &lt;a href="http://gigaom.com/2010/04/14/twitter-launches-places-annotations-user-streams-for-developers/"&gt;at its Chirp conference in April,&lt;/a&gt;
 ...the one that has the most potential to change the way the 
social network functions in fundamental ways is Annotations, which 
Twitter said would be rolled out in the second quarter of the year ... Annotations would allow developers (and Twitter itself, of course) to 
add additional information to a tweet — such as a string of text, a URL,
 a location tag or bits of data — without affecting its character count.
 In other words, such information would be metadata about the tweet or 
the user who posted it, and would be carried along as an additional 
payload as it traveled through the Twitter network. Apps and services 
could then collect that information and filter it or make sense of it. 
In some ways, Annotations are like Facebook’s &lt;a href="http://opengraphprotocol.org/"&gt;open graph protocol&lt;/a&gt;, which also adds metadata to the behavior of users on certain sites when they’re logged in&lt;a href="http://gigaom.com/2010/06/20/twitter-annotations-are-coming-what-do-they-mean-for-twitter-and-the-web/" target="_blank"&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href="http://gigaom.com/2010/06/20/twitter-annotations-are-coming-what-do-they-mean-for-twitter-and-the-web/" target="_blank"&gt;Twitter Annotations Are Coming — What Do They Mean For Twitter and the&amp;nbsp;Web? by Matthew Ingram&lt;/a&gt;&lt;br&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;What &amp;lt;others&amp;gt; did not mention is what I think is 
potentially the most fascinating use of opening up annotations. Google’s
 success today is built on their &lt;a href="http://en.wikipedia.org/wiki/PageRank" target="_blank"&gt;page rank&lt;/a&gt;
 algorithm that measures the validity of a web page by the number of 
incoming links to it and the page rank of the sites containing those 
links – its a system built on reputation. Twitter annotations could open
 up a new paradigm however – let’s call it &lt;/i&gt;&lt;i&gt;People rank- where 
reputation can be measured by the metadata that people choose to apply 
to links and the websites containing those links. Its not hard to see 
why Google and Microsoft have paid big bucks to get access to the 
Twitter firehose!&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/04/21/interesting-things-twitter-annotations-and-your-phone-as-a-web-server.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/04/21/interesting-things-twitter-annotations-and-your-phone-as-a-web-server.aspx" target="_blank"&gt;Interesting things – Twitter annotations and your phone as a web server by Jamie Thomson (i.e. me!)&lt;/a&gt;&lt;/i&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Twitter themselves said in May 2010:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;We will continue to move as quickly as we can to deliver the Annotations
 capability to the market so that developers everywhere can create 
innovative new business solutions on the growing Twitter platform.&lt;a href="http://blog.twitter.com/2010/05/twitter-platform.html" target="_blank"&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a href="http://blog.twitter.com/2010/05/twitter-platform.html" target="_blank"&gt;The Twitter Platform&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That was 20 months ago. The question I now ask is....&lt;b&gt;where are they&lt;/b&gt;? Evidently I'm not the only one asking that question because in a thread entitled &lt;a href="https://dev.twitter.com/discussions/3769" target="_blank"&gt;How can I try the Annotations API?&lt;/a&gt; in November 2011 &lt;a href="http://twitter.com/gcsfred" target="_blank"&gt;Gustavo Frederico&lt;/a&gt; asked:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;How can I try the Annotations API? I'm looking forward to trying it out.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;To which &lt;a href="http://twitter.com/episod" target="_blank"&gt;Taylor Singletary&lt;/a&gt; (a Twitter employee) replied:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;Annotations is still more concept then reality. Maybe some day we'll have more to say about them.&lt;/i&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Hmmm...in 18 months the situation has have gone from "&lt;b&gt;We will continue to move as quickly as we can to deliver the Annotations
 capability to the market&lt;/b&gt;" &amp;amp; "&lt;b&gt;rolled out in the second quarter of the year&lt;/b&gt;" to "&lt;b&gt;Annotations is still more concept then reality&lt;/b&gt;", that's quite a climb-down if you ask me. I have strong hopes that Twitter Annotations will be with us eventually but the deafening silence isn't particularly encouraging.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;You might ask why I am bothered, I am only a SQL Server developer after all. That is true but I still consider that my job can loosely be defined as &lt;b&gt;extracting value from data &lt;/b&gt;and from that perspective the onslaught of data (nay, &lt;i&gt;structured&lt;/i&gt; data) that Twitter Annotations would bring should be of interest to both myself and my clients.&lt;/p&gt;&lt;p&gt;I am also fascinated as to how Twitter Annotations could work with &lt;a href="http://schema.org/" target="_blank"&gt;Schema.org&lt;/a&gt; which is heavily backed by Google and Microsoft and which Microsoft are pushing as the backbone of Contracts in Windows 8 (Schema.org is mentioned in &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/APP-405T" target="_blank"&gt;this video&lt;/a&gt; from the Build conference).&lt;br&gt;&lt;/p&gt;&lt;p&gt;So, I ask again, whatever happened to Twitter Annotations? Does anyone know?&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41296" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/IrN-l46cghg" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/twitter/default.aspx">twitter</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/random+waffle/default.aspx">random waffle</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/25/whatever-happened-to-twitter-annotations.aspx</feedburner:origLink></item><item><title>Use VALUES clause to get the maximum value from some columns [SQL Server, T-SQL]</title><link>http://feedproxy.google.com/~r/jamiet/~3/x4WC_EXLtIM/use-values-clause-to-get-the-maximum-value-from-some-columns-sql-server-t-sql.aspx</link><pubDate>Fri, 20 Jan 2012 13:22:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41191</guid><dc:creator>jamiet</dc:creator><slash:comments>7</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41191.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41191</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41191</wfw:comment><description>&lt;p&gt;My ex-colleague Paul Mcmillan pointed me at a &lt;a href="http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns" target="_blank"&gt;thread on Stack Overflow&lt;/a&gt; that demonstrated a neat T-SQL trick to get the maximum value from a collection of columns in a row. Paul had never seen it before and neither had I so I figure one or two of you out there might learn something from it too.&lt;/p&gt;
&lt;p&gt;In short you can use the VALUES clause to effectively union the values into a dataset and get the MAX from that dataset. Better demonstrated with code:&lt;/p&gt;&lt;p&gt;

&lt;code style="font-size:12px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE &lt;/span&gt;&lt;span&gt;@t &lt;/span&gt;&lt;span style="color:blue;"&gt;TABLE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;a &lt;/span&gt;&lt;span style="color:blue;"&gt;INT&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;b &lt;/span&gt;&lt;span style="color:blue;"&gt;INT&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;c &lt;/span&gt;&lt;span style="color:blue;"&gt;INT&lt;/span&gt;&lt;span style="color:gray;"&gt;);&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT &lt;/span&gt;&lt;span&gt;@t &lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;2&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;3&lt;/span&gt;&lt;span style="color:gray;"&gt;),(&lt;/span&gt;&lt;span style="color:black;"&gt;9&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:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;7&lt;/span&gt;&lt;span style="color:gray;"&gt;),(&lt;/span&gt;&lt;span style="color:black;"&gt;4&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:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;5&lt;/span&gt;&lt;span style="color:gray;"&gt;);&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&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; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta;"&gt;MAX&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;val&lt;/span&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;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;a&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;span style="color:black;"&gt;b&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;span style="color:black;"&gt;c&lt;/span&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;&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;AS &lt;/span&gt;&lt;span style="color:black;"&gt;value&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;val&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;MaxVal &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span&gt;@t&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;
&lt;/p&gt;&lt;p&gt;&lt;img src="http://jamiekt.files.wordpress.com/2012/01/valuesclauseresults.png" height="110" width="160"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I'm sure many of you knew this already but if you didn't, well, you too have learnt something today. See more uses for the VALUES clause at &lt;a href="http://beyondrelational.com/blogs/madhivanan/archive/2010/08/02/values-clause-in-sql-server-2008.aspx" target="_blank"&gt;Interesting enhancements to the VALUES Clause in SQL Server 2008&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt; &lt;/p&gt;&lt;p&gt;P.S. Oh, this only works in SQL Server 2008 and beyond. &lt;br&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41191" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/x4WC_EXLtIM" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/t-sql/default.aspx">t-sql</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/sql+server/default.aspx">sql server</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql-server-t-sql.aspx</feedburner:origLink></item><item><title>Get the SQLBits agenda in your phone's calendar</title><link>http://feedproxy.google.com/~r/jamiet/~3/ZvhCO6xJfKw/sqlbits-agenda-available-on-your-phone.aspx</link><pubDate>Wed, 18 Jan 2012 11:36:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:41159</guid><dc:creator>jamiet</dc:creator><slash:comments>4</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/41159.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=41159</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=41159</wfw:comment><description>&lt;p&gt;For &lt;a href="http://sqlbits.com/events/event8/SQLBitsVIII.aspx" target="_blank"&gt;SQLBits 8&lt;/a&gt; in April 2011 &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/04/04/get-the-sqlbits-agenda-on-your-phone.aspx" target="_blank"&gt;I published a calendar containing all of the sessions from the conference&lt;/a&gt;; anyone could subscribe to that calendar on their phone or calendar service (i.e. Hotmail or Google Calendar).    &lt;br&gt;&lt;/p&gt;  &lt;p&gt;For the upcoming &lt;a href="http://www.sqlbits.com" target="_blank"&gt;SQLBits X&lt;/a&gt; conference I have done the same again by adding all of the sessions to that same calendar. If you are already subscribed to that calendar from SQLBits 8 then you have nothing to do - all the SQLBits X sessions will automatically flow to your phone/Hotmail calendar/Google calendar (go take a look now - they should already be there).    &lt;br&gt;&lt;/p&gt;  &lt;p&gt;If you want to get this SQLBits calendar onto your smartphone then the easiest way to do it is add my calendar to whichever calendar service (i.e. Hotmail or Google) you have got synced to your phone and let technology do its thing.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you are on Hotmail this is dead simple – just click this link: &lt;a href="http://calendar.live.com/calendar/calendar.aspx?rru=addsubscription&amp;amp;url=webcals://cid-550f681dad532637.calendar.live.com/calendar/SQLBits/calendar.ics&amp;amp;name=SQLBits" title="http://calendar.live.com/calendar/calendar.aspx?rru=addsubscription&amp;amp;url=webcals://cid-550f681dad532637.calendar.live.com/calendar/SQLBits/calendar.ics&amp;amp;name=SQLBits"&gt;http://calendar.live.com/calendar/calendar.aspx?rru=addsubscription&amp;amp;url=webcals://cid-550f681dad532637.calendar.live.com/calendar/SQLBits/calendar.ics&amp;amp;name=SQLBits&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;If you're on Google then you will have to subscribe to URL &lt;a href="http://bit.ly/fwi6vy" title="webcal://cid-550f681dad532637.calendar.live.com/calendar/SQLBits/calendar.ics"&gt;http://cid-550f681dad532637.calendar.live.com/calendar/SQLBits/calendar.ics&lt;/a&gt; in Google Calendar by clicking Other calendars-&amp;gt;Add by URL.      &lt;br&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I will keep the calendar updated with any changes to the agenda so, assuming you have subscribed, changes will just propogate to you without you having to do anything. Remember, to save yourself work in the future make sure you subscribe to the calendar as opposed to importing it.&lt;/p&gt;  &lt;p&gt;Hope this is useful&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@jamiet&lt;/a&gt;     &lt;br&gt;&lt;/p&gt;  &lt;p&gt;UPDATE: I have just &lt;a href="http://www.google.com/googlecalendar/event_publisher_guide.html#toc-public" target="_blank"&gt;discovered &lt;/a&gt;an even easier way to subscribe to this SQLBits calendar using the Google Calendar service - simply click this button:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.google.com/calendar/render?cid=http%3A%2F%2Fcid-550f681dad532637.calendar.live.com%2Fcalendar%2FSQLBits%2Fcalendar.ics" target="_blank"&gt;&lt;img src="http://www.google.com/calendar/images/ext/gc_button6.gif" alt="0" border="0"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If Google Calendar reports that you do not have permission (as it seems to be doing for some people) then follow the instructions that I provided above. I promise you, the calendar *is* publicly available so if this button doesn't work its Google that is doing something wrong.    &lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=41159" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/ZvhCO6xJfKw" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/SQLBits/default.aspx">SQLBits</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/iCalendar/default.aspx">iCalendar</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/18/sqlbits-agenda-available-on-your-phone.aspx</feedburner:origLink></item><item><title>Implementing SQL Server solutions using Visual Studio 2010 Database Projects – a compendium of project experiences</title><link>http://feedproxy.google.com/~r/jamiet/~3/UrlT8EjnSSA/implementing-sql-server-solutions-using-visual-studio-2010-database-projects-a-compendium-of-project-experiences.aspx</link><pubDate>Sun, 01 Jan 2012 18:13:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40711</guid><dc:creator>jamiet</dc:creator><slash:comments>21</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40711.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40711</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40711</wfw:comment><description>&lt;p&gt;Over the past eighteen months I have worked on four separate projects for customers that wanted to make use of Visual Studio 2010 Database projects to manage their database schema.* All the while I have been trying to take lots of notes in order that I can write the blog post that you are reading right now – a compendium of experiences and tips from those eighteen months. I should note that this blog post should not necessarily be taken as a recommendation to actually &lt;i&gt;use&lt;/i&gt; database projects in Visual Studio 2010 – it is intended to be useful for those of you that have already made the decision to use them; having said that, I do make recommendations as to actions I think you should take if you have made that decision.&lt;/p&gt;  &lt;p&gt;First let’s be clear what we’re talking about here. Visual Studio Database Projects have been known by a few different names down the years, some of which you may be familiar with. If you have ever heard the terms datadude, DBPro, teamdata, TSData or Visual Studio Team System for Database Professionals then just know that all of these terms refer to the same thing, namely the project type highlighted below when starting a new project in Visual Studio:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_4302F9CA.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_4079C80C.png" 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" alt="image" border="0" height="411" width="748"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;From here onwards I am going to refer to Visual Studio Database projects and all the features therein simply as datadude because that’s a popular colloquial name (and is also much quicker to type). Know also that at the time of writing the features that I am talking about here are currently undergoing some changes ahead of the next release of SQL Server (i.e. SQL Server 2012) in which these features are mooted to be delivered under a new moniker - SQL Server Developer Tools (SSDT).&lt;/p&gt;  &lt;p&gt;OK, with all those preliminaries out of the way let’s dig in.&lt;/p&gt;  &lt;h1&gt;Continuous Integration&lt;/h1&gt;  &lt;p&gt;&lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html" target="_blank"&gt;Continuous Integration&lt;/a&gt; (CI) is a development practise that has existed for many years but in my experience has not been wholly embraced by the database community. The idea behind CI for databases is that every time a developer checks-in a piece of code be it a stored procedure, a table definition or whatever, the entire database project is built and then deployed to a database instance. Microsoft provide a useful article &lt;a href="http://msdn.microsoft.com/en-us/library/aa833165.aspx" target="_blank"&gt;An Overview of Database Build and Deployment&lt;/a&gt; that goes some way to explaining how to setup your CI deployment.&lt;/p&gt;  &lt;p&gt;CI is one of the fundamental tenets that underpins a lot of the things I talk about later in this blog post and hence gives rise to my first recommendation when using datadude:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #1: Use Source Control and implement a Continuous Integration deployment&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;i&gt;In an earlier draft of this blog post I outlined in detail the CI configuration from one of the aforementioned projects. Its not suitable for inclusion at this point in the current draft but I still think there is some useful information to be gleaned so I have included it below in “Appendix – An example CI configuration”.&lt;/i&gt;&lt;/p&gt;  &lt;h1&gt;Composite Projects&lt;/h1&gt;  &lt;p&gt;Each of the four aforementioned projects were brownfield projects meaning that each already encompassed some established, deployed, databases and they wanted to bring those databases under the control of datadude. Each project had thousands of objects across multiple databases and in this situation it is very likely that some of the stored procedures, views or functions will refer to objects in one of the other databases. The way to resolve those references is to use &lt;a href="http://blogs.msdn.com/b/gertd/archive/2007/07/26/database-references.aspx" target="_blank"&gt;database references&lt;/a&gt; however once you have applied all of your database references it is still very possible that you will run into a situation where code in database A refers to an object in database B while at the same time database B refers to an object in database A. This is depicted in the following figure:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_05B21F36.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_2BA7CF8C.png" 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" alt="image" border="0" height="228" width="435"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here we have a view [DB1]..[View2] that selects data from [DB2]..[Table1] and a view [DB2]..[View1] that selects data from [DB1]..[Table1]. Datadude does not allow a database reference from [DB2] to [DB1] if there is already a database reference from [DB2] to [DB1] and hence will return an error akin to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SQL03006: View: [dbo].[View1] has an unresolved reference to object [DB1].[dbo].[Table1]. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_0395206D.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_096FC406.png" 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" alt="image" border="0" height="108" width="574"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We have the proverbial chicken-and-egg problem, [DB1] can’t be created before [DB2] and vice versa. This problem is solved by using &lt;i&gt;&lt;b&gt;Composite Projects&lt;/b&gt;&lt;/i&gt; (not to be confused with Partial Projects) which allow you to split objects that are intended to be in the same database over multiple datadude projects. I could go over how you set one of these things up but there’s really no need because there is a rather excellent walkthrough on MSDN at &lt;a href="http://msdn.microsoft.com/en-us/library/dd193415.aspx" target="_blank"&gt;Walkthrough: Partition a Database Project by Using Composite Projects&lt;/a&gt;; the reason for me mentioning it here is to make you aware that composite projects exist and of the problem that they solve. If you are introducing datadude into a brownfield project then it is highly likely that you are going to require composite projects so learn them and learn them good.&lt;/p&gt;  &lt;p&gt;One important last note about composite projects is to answer the question “How does the tool know that the multiple projects refer to the same database?” The answer is given at the walkthrough that I linked to above; namely, it says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5A3DD86E.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_7509FE7A.png" 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="Composite projects - referring to the same database" alt="Do not specify server variables and values or database variables and values when you define references in a composite project. Because no variables are defined, the referenced project is assumed to share the target server and database of the current project." border="0" height="116" width="631"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;“Do not specify server variables and values or database variables and values when you define references in a composite project. Because no variables are defined, the referenced project is assumed to share the target server and database of the current project.”&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So now you know! To put it another way, if you reference one project from another and don’t tell datadude that the two projects refer to different databases then it assumes they refer to the &lt;i&gt;same &lt;/i&gt;database.&lt;/p&gt;  &lt;h1&gt;Code Analysis&lt;/h1&gt;  &lt;p&gt;Datadude provides the ability to analyse your code projects for code in stored procedures and functions that it considers to be inferior and highlight it – this feature is called &lt;b&gt;&lt;i&gt;Code Analysis&lt;/i&gt;&lt;/b&gt;. Note that Code Analysis will not highlight code that is syntactically incorrect (datadude does that already, which may well be considered its core feature), it highlights code that is syntactically correct but may be considered defective when executed. Specifically Code Analysis will highlight the following perceived code defects (click through on the links for explanations of why these are considered code defects):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193296.aspx" target="_blank"&gt;Use of SELECT *&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd172121.aspx" target="_blank"&gt;Use of @@IDENTITY rather than SCOPE_IDENTITY()&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193263.aspx" target="_blank"&gt;NCHAR &amp;amp; NVARCHAR fields whose maximum length is 1 or 2&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd172122.aspx" target="_blank"&gt;Deprecated join syntax&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd172136.aspx" target="_blank"&gt;An output parameter that might not be assigned to&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193269.aspx" target="_blank"&gt;Casts that could result in data loss&lt;/a&gt; (in my experience this is the one that shows up most often – particularly in inherited code) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd172134.aspx" target="_blank"&gt;Use of special characters in object names&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193421.aspx" target="_blank"&gt;Use of reserved words&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd172115.aspx" target="_blank"&gt;Use of sp_ prefix for stored procedures&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193249.aspx" target="_blank"&gt;Use of unindexed columns in IN predicates&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193273.aspx" target="_blank"&gt;Use of patterns beginning with a wildcard in a LIKE predicate&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193264.aspx" target="_blank"&gt;Code that would not use an existing index that might actually be beneficial&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193267.aspx" target="_blank"&gt;Use of ISNULL() on nullable columns&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193285.aspx" target="_blank"&gt;Deterministic function calls in a WHERE predicate&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In my opinion the best aspect of Code Analysis is that it can be run as part of your Continuous Integration deployment meaning that if anyone checks in some deficient code, BOOM, your CI deployment fails and the developer is left red-faced. Nothing else has increased the code quality on my projects quite like running Code Analysis as part of a CI deployment.&lt;/p&gt;  &lt;p&gt;Hopefully I have convinced you that turning on Code Analysis is a good idea. If you agree then head to the project properties and check the box labelled &lt;b&gt;Enable Code Analysis on Build&lt;/b&gt;. I also recommend checking the &lt;b&gt;Treat warnings as errors&lt;/b&gt; boxes otherwise you’ll find that &lt;a href="http://www.codinghorror.com/blog/2007/08/discipline-makes-strong-developers.html" target="_blank"&gt;undisciplined developers&lt;/a&gt; will simply ignore the warnings.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_0CC135E1.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_129BD97A.png" 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="Enable datadude code analysis" alt="Enable datadude code analysis" border="0" height="204" width="583"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;N.B. Incidentally if you have time I highly recommend that you go and read the blog post I linked to there – &lt;/i&gt;&lt;a href="http://www.codinghorror.com/blog/2007/08/discipline-makes-strong-developers.html" target="_blank"&gt;&lt;i&gt;Discipline Makes Strong Developers&lt;/i&gt;&lt;/a&gt;&lt;i&gt; by Jeff Atwood. I’ve read many thousands of blog posts in my time and that is the one that has influenced me more than any other.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Turning on Code Analysis on a greenfield project is a no-brainer. On a brownfield project its not quite so easy – on a recent engagement I moved a single database into datadude and turned on Code Analysis which immediately found over two thousand perceived code defects. I generally abhor the use of that famous maxim &lt;a href="http://en.wikipedia.org/wiki/If_it_ain%27t_broke,_don%27t_fix_it#.22If_it_ain.27t_broke.2C_don.27t_fix_it..22" target="_blank"&gt;if it aint broke, don’t fix it&lt;/a&gt;&lt;i&gt;&lt;/i&gt; in our industry but on occasions like this you may be well advised to heed that advice and leave well alone for fear of breaking code that does what it is supposed to (no matter how inefficiently it does it). Instead you do have the option to suppress Code Analysis warnings/errors:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_434EE125.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_492984BE.png" 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="Suppress datadude code analysis" alt="Suppress datadude code analysis" border="0" height="195" width="585"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I advise using Code Analysis suppression sparingly. Recently I discovered that one of the developers on my team had decided it was OK to simply suppress every error that was thrown by Code Analysis without first investigating the cause. I was not amused!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #2: Turn on Code Analysis&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h1&gt;Realising the value of idempotency&lt;/h1&gt;  &lt;p&gt;An operation is considered idempotent if it produces the same result no matter how many times that operation is applied; for example, multiplication by a factor of one is an idempotent operation – no matter how many times you multiple a number by one the result will always be the same.&lt;/p&gt;  &lt;p&gt;Idempotency is a vital facet of database deployment using datadude. Datadude tries to ensure that no matter how many times you deploy the same project the state of your database should be the same after each deployment. The implication here is that during a deployment datadude will examine the target database to see what changes (if any) need to be made rather than simply attempting to create lots of objects; if all the objects already exist nothing will be done. In my opinion this is the single biggest benefit of using datadude – you don’t have to determine what needs to be done to change your database schema to the desired state, datadude does it for you.&lt;/p&gt;  &lt;p&gt;If I have convinced you about the value of idempotency within datadude then you should also realise that the same rigour should be applied to data as well. Datadude provides Post-Deployment scripts that allow you to deploy data to your schema however there is no inbuilt magic here – datadude will simply go and run those scripts as-is, it will not try and comprehend the contents of those scripts. What this means is that you, the developer, are responsible for making your Post-Deployment scripts idempotent and the easiest way to do that is to employ the T-SQL MERGE statement.&lt;/p&gt;  &lt;p&gt;T-SQL’s INSERT is not sufficient as it will work once and thereafter fail as it will be attempting to insert already inserted data; this gives rise to my third recommendation:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #3: When running your deployment in a test environment, run it more than once.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h1&gt;No-brainer Recommendations&lt;/h1&gt;  &lt;p&gt;I consider Code Analysis and Idempotency to be so important that I called them out as dedicated headlines. In this section I’ll outline some additional simple measures that you can undertake and which will, if employed correctly, have a profound effect on the success of your datadude projects.&lt;/p&gt;  &lt;h2&gt;Putting a build number into the DB&lt;/h2&gt;  &lt;p&gt;I find it is very useful to maintain a log of deployments that have been made to a database and my chosen method is to use a Post-Deployment script to insert a value into some table. Here’s the definition of the table I use for this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[DeployLog]          &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;(          &lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;[BuildId]&amp;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;NVARCHAR&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;50&lt;/span&gt;&lt;span style="color:gray;"&gt;)          &lt;br&gt;,&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;[DeployDatetime]&amp;nbsp;&amp;nbsp;&amp;nbsp; SMALLDATETIME          &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;CONSTRAINT&amp;nbsp; &lt;/span&gt;&lt;span style="color:black;"&gt;PK_dboDeployLog &lt;/span&gt;&lt;span style="color:blue;"&gt;PRIMARY KEY &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;[DeployDatetime]&lt;/span&gt;&lt;span style="color:gray;"&gt;)          &lt;br&gt;)&lt;/span&gt;&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In my Post-Deployment script I will use:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;INSERT &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[DeployLog]&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;[BuildId]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;[DeployDatetime]&lt;/span&gt;&lt;span style="color:gray;"&gt;)          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;'$(BuildId)'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;());&lt;/span&gt;&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;to insert a row into that table during every deployment. &lt;font color="#ff0000"&gt;$(BuildId)&lt;/font&gt; is a variable defined in the .sqlcmdvars file of my project:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_0ECE0EDD.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0D8975FE.png" 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" alt="image" border="0" height="216" width="293"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is what we see inside that file:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5E578A66.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_64322DFF.png" 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" alt="image" border="0" height="219" width="526"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The &lt;font color="#ff0000"&gt;$(BuildId)&lt;/font&gt; variable has been defined with a default value of UNKNOWN and hence subsequent deployments from Visual Studio will result in the following:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5BCE58A8.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0F964EFA.png" 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" alt="image" border="0" height="284" width="513"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;On first glance that might not seem particularly useful however it comes into its own if you are doing CI deployments (see recommendation #1) because each build in a CI environment will result in a new build identifier. The following command-line call to vsdbcmd.exe is how deployments are generally done using datadude, note the presence of the &lt;b&gt;/p:BuildId&lt;/b&gt; switch:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;..\Tools\VSDBCMD\vsdbcmd.exe /Action:Deploy /ConnectionString:"Data Source=.;Integrated Security=True;Pooling=False" &lt;b&gt;/p:BuildId="some-value"&lt;/b&gt; /DeployToDatabase:+ /ManifestFile:.\FinanceDB\sql\release\FinanceDB.deploymanifest&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Your CI tool should be able to replace “some-value” with an identifier for the current build (that’s outside the scope of this blog post but any CI tool worth its salt will be able to do this) – when the deployment executes that value will then make its way into your [dbo].[DeployLog] table and you will have a self-maintaining history of all the deployments (datetime &amp;amp; build identifier) that have been made to your database.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #4: Maintain an automated history of your deployments&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Use Schema View&lt;/h2&gt;  &lt;p&gt;It is natural to navigate through all of the objects in your database project using Solution Explorer however datadude provides a better mechanism for doing just that – the Schema View window.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_6E36A95D.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_781B9AC8.png" 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" alt="image" border="0" height="304" width="250"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Schema View provides a logical view of all the objects defined in your database project regardless of which file they may be defined in. That is very useful for many reasons, not least because it makes it easy to locate whichever object you are after – that’s advantageous if multiple objects are defined in the same file. Moreover if some files have property BuildAction=”Not In Build” (see later) they won’t show up in Schema View (this is a good thing by the way). Schema View is also the place that operations such as refactoring and dependency analysis are launched from.&lt;/p&gt;  &lt;p&gt;Some people think that it is important that the name of each file in a datadude project should accurately reflect the object defined within. I disagree; object renames mean that maintaining the filenames becomes laborious and having the Schema View means you never have to use the filenames to navigate your project anyway.&lt;/p&gt;  &lt;p&gt;One final reason to use Schema View is the External Elements button:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_04A947E5.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_6349A248.png" 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" alt="image" border="0" height="152" width="356"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Toggling this button on means that objects in referenced projects show up in the project that they are referenced from (this is particularly useful if you are using Composite Projects). Note in the following screenshot how the object [dbo].[t1] in project Database2 appears in the [dbo] schema of Database3 – that’s because Database3 has a reference to Database2.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_62050969.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_47586D50.png" 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" alt="image" border="0" height="439" width="243"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;For those reasons my fifth recommendation is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #5: Use Schema View in preference to Solution Explorer&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You will still need Solution Explorer to navigate files that do not contain database objects (e.g. Post-Deployment scripts) but ordinarily you should spend most of your time interacting with Schema View.&lt;/p&gt;  &lt;h2&gt;Make liberal use of PRINT statements in Pre/Post-Deployment Scripts&lt;/h2&gt;  &lt;p&gt;When you deploy a datadude project datadude will take care of telling you what it is up to. For example, the following screenshot shows the output from deploying the already discussed [dbo].[DeplogLog]:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_11074541.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_68F49621.png" 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" alt="image" border="0" height="117" width="479"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Of course it only does this for objects that it knows about and that doesn’t include anything in your Pre or Post \deployment scripts so you need to take responsibility for outputting pertinent information from those scripts. Here I have amended the script that inserts into [dbo].[DeployLog]:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;SET NOCOUNT ON&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[DeployLog]&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;[BuildId]&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;[DeployDatetime]&lt;/span&gt;&lt;span style="color:gray;"&gt;)          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;'$(BuildId)'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;());          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:magenta;"&gt;CAST&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:#434343;"&gt;@@ROWCOUNT &lt;/span&gt;&lt;span style="color:blue;"&gt;as NVARCHAR&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:gray;"&gt;)) + &lt;/span&gt;&lt;span style="color:red;"&gt;N'rows inserted into [dbo].[DeployLog], BuildId=$(BuildId)'&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This gives us much more useful output:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_159D4FFB.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_46BC8A9B.png" 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" alt="image" border="0" height="122" width="475"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Adding PRINT statements to your Pre &amp;amp; Post Deployment scripts is so easy it really is a no-brainer and hence my next recommendation is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #6: Any action in a Pre or Post-Deployment Script should use PRINT to state what has been done&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Output variable values in your Pre-Deployment script&lt;/h2&gt;  &lt;p&gt;This is in the same vein as the previous bullet-point – output as much information as is possible. In this case we’re talking about outputting the values of all variables that are stored in the .sqlcmdvars file; first, a reminder of what’s in that file:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_73654474.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_5924DB50.png" 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" alt="image" border="0" height="219" width="526"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is the contents of my amended Pre-Deployment Script:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'DefaultDataPath=$(DefaultDataPath)'&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'DatabaseName=$(DatabaseName)'&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'DefaultLogPath=$(DefaultLogPath)'&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'BuildId=$(BuildId)'&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And the resultant output:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_22D3B341.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_3D9FD94D.png" 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" alt="image" border="0" height="119" width="568"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is the sort of simple amendment that will pay off in spades later in your project (especially if you are supplying many values from the command-line) and again, its so easy to do it there really is no reason not to. Just remember to update your Pre-Deployment script whenever you add new variables to .sqlcmdvars.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #7: Output the value of all variables in your Pre-Deployment script&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;One Object Per File&lt;/h2&gt;  &lt;p&gt;Datadude doesn’t restrict what can go in a file, for example the following file, “t.table.sql”, defines three objects; a table, a primary key and a view:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_75721D70.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_1B67CDC7.png" 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" alt="image" border="0" height="248" width="352"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Even though they’re all defined in the same file they show up in Schema View separately (one of the aforementioned benefits of using Schema View):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_6C35E22F.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_3D03F698.png" 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" alt="image" border="0" height="355" width="314"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That said, just because you can doesn’t mean that you should. I prefer to go for one object per file for the simple reason that its easier to track the history of an object via Source Control. Moreover, if an object is no longer required then it is a simple change to just remove the file containing that object from the build (see “Don’t delete anything from your project” later) as opposed to editing a file to remove all traces of an object.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #8: Each database object should be defined in a dedicated file&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Time your Pre and Post Deployment Scripts&lt;/h2&gt;  &lt;p&gt;Its always useful to know where time is spent when doing deployments, in my experience the majority of time spent is in the Post-Deployment script (your mileage may vary of course). An easy win is to output the time taken to run your Pre and Post Deployment scripts. Adapt your Pre-Deployment script so that it looks something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;DECLARE &lt;/span&gt;&lt;span style="color:#434343;"&gt;@vPreDeploymentStartTime &lt;/span&gt;&lt;span style="color:blue;"&gt;DATETIME = &lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;();          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'****************Begin Pre-Deployment script at ' &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:blue;"&gt;VARCHAR&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;30&lt;/span&gt;&lt;span style="color:gray;"&gt;),&lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;(),&lt;/span&gt;&lt;span style="color:black;"&gt;120&lt;/span&gt;&lt;span style="color:gray;"&gt;) + &lt;/span&gt;&lt;span style="color:red;"&gt;'***********************'&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;         &lt;br&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;/*Call other scripts from here using SQLCMD's :r syntax          &lt;br&gt;Example:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :r .\myfile.sql&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;*/           &lt;br&gt;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'Pre-Deployment duration = ' &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:blue;"&gt;VARCHAR&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:gray;"&gt;),&lt;/span&gt;&lt;span style="color:magenta;"&gt;DATEDIFF&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;ss&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:#434343;"&gt;@vPreDeploymentStartTime&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;())) + &lt;/span&gt;&lt;span style="color:red;"&gt;' seconds'&lt;/span&gt;&lt;span style="color:gray;"&gt;;          &lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRINT &lt;/span&gt;&lt;span style="color:red;"&gt;'****************End Pre-Deployment script at ' &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:blue;"&gt;VARCHAR&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;30&lt;/span&gt;&lt;span style="color:gray;"&gt;),&lt;/span&gt;&lt;span style="color:magenta;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:gray;"&gt;(),&lt;/span&gt;&lt;span style="color:black;"&gt;120&lt;/span&gt;&lt;span style="color:gray;"&gt;) + &lt;/span&gt;&lt;span style="color:red;"&gt;'***********************'&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;then do similar for your Post-Deployment script. When you deploy your output will include the following:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_3BBF5DB9.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_217EF495.png" 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" alt="image" border="0" height="201" width="593"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Note the lines:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************Begin Pre-Deployment script at 2011-12-31 20:00:34***********************        &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pre-Deployment duration = 0 seconds         &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************End Pre-Deployment script at 2011-12-31 20:00:34***********************         &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************Begin Post-Deployment script at 2011-12-31 20:00:34***********************        &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Post-Deployment duration = 0 seconds         &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************End Post-Deployment script at 2011-12-31 20:00:34***********************&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In this particular case its not all that useful to know that the deployment took 0 seconds but if and when your deployments snowball to many minutes it will be useful to know how long your scripts are taking at which point you can investigate further by timing each individual step in your Pre and Post Deployment scripts.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #9: Time your deployments and output the timings&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Use sqlcmdvars and the command-line as much as possible&lt;/h2&gt;  &lt;p&gt;Hardcoding any value into a piece of code is a fraught practise; you should assume that values previously thought to be constant may not be so in the future. You can protect yourself from future changes by storing all literal values as variables in your .sqlcmdvars file. Sure, you can supply default values for those variables but you have the added advantage that they can be overridden from the command-line when deploying using &lt;a href="http://msdn.microsoft.com/en-us/library/dd193283.aspx" target="_blank"&gt;vsdbcmd.exe&lt;/a&gt;. Moreover, if you have values that are hardcoded in multiple places in your code then specifying those values in .sqlcmdvars ensures that your code adheres to the principle of &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt;. Lastly, if values are stored in the .sqlcmdvars file then you can output them at deploy time (see recommendation #7).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #10: All literal values should be stored in your .sqlcmdvars file&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Every developer gets their own development database&lt;/h2&gt;  &lt;p&gt;In most SQL Server development shops that I’ve been on all developers work against a single centralised development database. To me this is an antiquated way of working because its possible that work one person is doing can conflict with that of someone else, I find it much better for every developer to work in isolation and then use the CI deployment to check that one’s code is not in conflict with anyone else’s. Datadude supports (nay encourages) this way of working with the notion of an Isolated Development Environment:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_79001280.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0CACFC15.png" 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" alt="image" border="0" height="172" width="541"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Every developer should configure their isolated development environment which, typically, would be their local instance. And so to my next recommendation:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #11: Every developer should use the Isolated Dev Environment settings in order to author their code&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Incidentally, if every developer has their own development database and you are following my earlier recommendation to use a [DeployLog] table then you can track how often a developer is bothering to deploy and test their code. On a recent project we used this evidence in a (ahem) &lt;i&gt;discussion&lt;/i&gt; with a developer who tried to convince us that he was testing his code sufficiently even though he was repeatedly causing the CI deployment to fail.&lt;/p&gt;  &lt;h2&gt;Don’t delete anything from your project&lt;/h2&gt;  &lt;p&gt;When projects are no longer required in your database then intuitively it makes sense to remove the file containing that object from the datadude project, I would however like to suggest a different approach. Rather than removing a file just change the Build property to “Not in Build”:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_0B686336.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_114306CF.png" 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" alt="image" border="0" height="293" width="330"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This has the advantage that your project maintains some semblance of history of what objects have been removed from your database – that can be useful to anyone inheriting your code in the future.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #12: Use “Not in Build” to remove an object from your database&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Build and Deploy your datadude projects outside of Visual Studio&lt;/h2&gt;  &lt;p&gt;Building and deploying your datadude projects within Visual Studio can become a real time hog; in my experience its not unusual for deployments to take many minutes and your Visual Studio environment will be unavailable for further development work during that time. For that reason I recommend investing some time in writing some msbuild scripts that will build and deploy your project(s) from the command-line. Here are some examples that you can adapt for your own use, firstly a script to build a solution:&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:'Courier New', courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding:2px 5px;white-space:nowrap;overflow:auto;"&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;1.0&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;utf-8&lt;/span&gt;"&lt;span&gt;?&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;lt;!--&lt;/span&gt; &lt;span&gt;Execute using:&lt;/span&gt;       &lt;br&gt;&lt;span&gt;msbuild SolutionBuild.proj&lt;/span&gt;       &lt;br&gt;&lt;span&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Project&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;xmlns&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"       &lt;br&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;&lt;span&gt;DefaultTargets&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Build&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;span&gt;Notes:&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When doing .net development Visual Studio Configurations are particularly useful because they can affect&lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;how the code is executed (i.e. under the Debug configuration&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; debug symbols can be used to step through the code (something like that anyway - I don't know too much about that &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;stuff).&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; In DBPro, Configurations are less relevant because there is no such thing as debugging symbols. Nonetheless, they &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;can still be useful&lt;/span&gt; &lt;span&gt;for times when you want to do different things (e.g. you might want to run Code Analysis in &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;a debug situation but not in a release&lt;/span&gt;       &lt;span&gt;situation. There is a useful thread on this here: &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;"Debug vs Release" http://social.msdn.microsoft.com/Forums/en-US/vstsdb/thread/a0ec0dc0-a907-45ba-a2ea-d2f0175261a7&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;      &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note that Visual Studio Configurations should not be used to maintain different settings per environment. &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;The correct way to do that is to maintain&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; seperate .sqlcmdvars files per environment and then choose which one to use at deployment time when using&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vsdbcmd.exe (use syntax "/p:SqlCommandVariablesFile=$(ProjectName)_$(Environment).sqlcmdvars")&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt; &lt;span&gt;ItemGroup&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;span&gt;List all the configurations here that you want to build&lt;/span&gt; &lt;span&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Include&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Debug&lt;/span&gt;"&lt;span&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Include&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Release&lt;/span&gt;"&lt;span&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span&gt;ItemGroup&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Build&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Building %(Config.Identity) configuration...&lt;/span&gt;"&lt;span&gt;/&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;MSBuild&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Projects&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;.\Lloyds.UKTax.DB.sln&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;Properties&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Configuration=%(Config.Identity)&lt;/span&gt;"&lt;span&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span&gt;Target&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt; &lt;span&gt;Project&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;and secondly a script that will deploy a datadude project:&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:'Courier New', courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#ffffff;padding-left:5px;padding-right:5px;white-space:nowrap;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="color:#008000;"&gt;Execute using:&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#008000;"&gt;msbuild SolutionDeploy.proj /Target:Deploy&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&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:#ff0000;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Build;Deploy&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt; &lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;span&gt;At time of writing I don't see a reason for anything else to be used but that may change in the future hence why this &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;is a property and hence can be overriden.&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DevServer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Data Source=GBS0039182\GLDDEV01;Integrated Security=True;Pooling=False&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DevServer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt; &lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ProjectToBuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Include&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;SolutionBuild.proj&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;span style="color:#008000;"&gt;Notes:&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Add a &amp;lt;DbProj&amp;gt; item for every database project (.dbproj) that needs to be deployed. They will get deployed in the &lt;br&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 style="color:#008000;"&gt;order that they are listed&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thus it is your responsibility to make sure they are listed in the correct order (respecting dependency order).&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Identity is a metadata reference. It refers to the name of the item (i.e. Include="The bit that goes here is the &lt;br&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; &lt;/span&gt;&lt;span style="color:#008000;"&gt;identity")&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note also that whatever you put for Include is important. Include="dev_thomsonj" means the project will only get &lt;br&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;deployed if the&lt;/span&gt;       &lt;span style="color:#008000;"&gt;deployment is being executed by username=dev_thomsonj&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt; &lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbProj&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Include&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;username&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;MyDB&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ProjectName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;MySoln.MyDB&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ProjectName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;OutputPath&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;\&lt;/span&gt;%(ProjectName)\sql\$(Configuration)\\cf1 &amp;lt;/&lt;span style="color:#a31515;"&gt;OutputPath&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DeployConnStr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Data Source=localhost;Integrated Security=True;Pooling=False&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DeployConnStr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;DbProj&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Build&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MSBuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Projects&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;@(ProjectToBuild)&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;Target&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Deploy&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;span style="color:#008000;"&gt;Notes:&lt;/span&gt;       &lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 09 is the hex code for TAB, hence all of the %09 references that you can see. See http://asciitable.com/ &lt;br&gt;&lt;/span&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span style="color:#008000;"&gt;for more details.&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;USERNAME=$(USERNAME)&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Condition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;'%(DbProj.Identity)'==$(USERNAME)&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Deploying:&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Project%09%09%09:&amp;nbsp; %(DbProj.ProjectName)&amp;nbsp;&amp;nbsp; &lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DbName%09%09%09:&amp;nbsp; %(DbProj.DbName)&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; From OutputPath%09%09:&amp;nbsp; %(DbProj.OutputPath)&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; To ConnStr%09%09:&amp;nbsp; %(DbProj.DeployConnStr)&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; By%09%09%09:&amp;nbsp; %(DbProj.Identity)&lt;/span&gt;"      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Condition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;'%(DbProj.Identity)'==$(USERNAME)&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$(VSINSTALLDIR)\vstsdb\deploy\vsdbcmd.exe&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span&gt; &lt;br&gt;&lt;/span&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/Action:Deploy /ConnectionString:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;%(DbProj.DeployConnStr)&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span&gt; /DeployToDatabase+ &lt;br&gt;&lt;/span&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/manifest:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;.%(DbProj.OutputPath)%(DbProj.ProjectName).deploymanifest&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span&gt; /p:TargetDatabase=%(DbProj.DbName) &lt;br&gt;&lt;/span&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/p:Build=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from cmd line&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;      &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;Target&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="color:#a31515;"&gt;Project&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Writing these scripts may appear to be laborious but they’ll save you heaps of time in the long run.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="4"&gt;Recommendation #13: Build and deploy to your development sandbox using scripts&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;i&gt;UPDATE: Upon reading this blog post Mordechai Danielov wrote a follow-up in which he published a useful script that builds a series of projects using Powershell. Its at &lt;/i&gt;&lt;a href="http://bitwisemnm.com/2012/01/03/building-your-database-solutions-outside-of-visual-studio/" target="_blank"&gt;&lt;i&gt;building your database solutions outside of Visual Studio&lt;/i&gt;&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;/p&gt;  &lt;h1&gt;Useful links&lt;/h1&gt;  &lt;p&gt;Over the years I’ve collected some links to MSDN articles that have proved invaluable:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193409.aspx" target="_blank"&gt;Build and Deploy Databases to an Isolated Development Environment&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa833165.aspx#CommunityContent" target="_blank"&gt;An Overview of Database Build and Deployment&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/dvdarchive/cc164243.aspx" target="_blank"&gt;Apply Test-Driven Development to your Database Projects&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd193415.aspx" target="_blank"&gt;Walkthrough: Partition a Database Project by Using Composite Projects&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/bahill/archive/2009/03/23/right-sizing-the-master-dbschema-file-for-better-design-time-performance.aspx" target="_blank"&gt;Right sizing the master.dbschema file for better design time performance&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd483214.aspx#id0100036" target="_blank"&gt;Referencing for Shared Server-Level Objects&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h1&gt;Datadude bugs&lt;/h1&gt;  &lt;p&gt;Like any substantial piece of software datadude is not without bugs. Many of the issues I have found are concerned with the datadude interpreter not correctly parsing T-SQL code, here’s a list of some bugs that I have found down the years:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/688259/refactor-rename-in-schema-view-crashes-visual-studio" target="_blank"&gt;Under certain circumstances a Refactor-&amp;gt;Rename operation can crash Visual Studio&lt;/a&gt; (followed up &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/705676/would-like-feedback-on-a-bug-that-has-been-closed-as-wont-fix" target="_blank"&gt;here&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/674391/datadude-valid-merge-syntax-causes-warnings#details" target="_blank"&gt;Valid T-SQL MERGE syntax can cause false warnings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/668651/datadude-refactoring-applies-the-wrong-edits-to-unit-tests" target="_blank"&gt;Refactor-&amp;gt;Rename doesn’t work properly for database unit tests&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/657580/datadude-deploy-failure-something-to-do-with-triggers#details" target="_blank"&gt;Removal of triggers from your datadude project may, under certain circumstances, cause a failed deployment&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/635058/datadude-derived-table-with-the-same-alias-as-one-of-the-columns-in-that-derived-table-incorrectly-causes-a-warning#details" target="_blank"&gt;Rare naming circumstance can cause false warnings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/624876/datadude-t-sql-parser-throws-warnings-for-valid-t-sql#details" target="_blank"&gt;Valid function definition containing a CTE can cause false warnings&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/606656/datadude-datadude-attempts-to-deploy-a-default-constraint-before-deploying-the-function-referenced-by-that-constraint" target="_blank"&gt;A default constraint is attempted to be deployed before a function referenced by that constraint – hence an error occurs&lt;/a&gt; (confirmed as fixed in VS2010 SP1) &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/605544/datadude-failure-to-recognise-operand-type-clash-when-using-table-types#details" target="_blank"&gt;Datadude doesn’t catch a type mismatch between a table-valued-parameter and a parameter passed to it&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/594309/datadude-datetime2-data-generator-doesnt-generate-unique-values-when-the-column-is-part-of-a-composite-key" target="_blank"&gt;DateTime2 Data generator doesn't generate unique values when the column is part of a composite key&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/592932/datadude-certain-db-unit-test-class-names-can-throw-errors-when-the-class-is-created" target="_blank"&gt;Unit test class files cannot contain periods&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/586040/datadude-valid-create-view-syntax-throws-errors#details" target="_blank"&gt;Valid CREATE VIEW definition throws errors&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/573824/datadude-unexplained-warnings-from-dbproj-project" target="_blank"&gt;MERGE syntax in a stored procedure creates false warnings&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Some of these bugs were reported a long time ago and may well have been fixed in later service packs.&lt;/p&gt;  &lt;h1&gt;Previous datadude blog posts&lt;/h1&gt;  &lt;p&gt;I have &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Datadude/default.aspx" target="_blank"&gt;blogged on datadude&lt;/a&gt; quite a bit in the past:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/11/21/workaround-for-datadude-deployment-bug.aspx"&gt;Workaround for datadude deployment bug – NullReferenceException&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/02/10/building-a-database-installer-with-wix-datadude-and-visual-studio-2010.aspx"&gt;Building a database installer with WiX, datadude and Visual Studio 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/01/19/generate-multiple-sqlcmdvars-vars-in-your-database-projects.aspx"&gt;Generate multiple SqlCmdVars files in your database projects&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/01/17/querying-visual-studio-project-files.aspx"&gt;Querying Visual Studio project files using T-SQL and Powershell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/10/19/maintaining-version-history-in-your-database-using-visual-studio-2010.aspx"&gt;Maintaining version history in your database using Visual Studio 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/10/06/enforcing-naming-conventions-using-database-unit-testing.aspx"&gt;Enforcing naming conventions using database unit testing&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/09/18/experiences-from-writing-sp-cascadingdataviewer-db-unit-testing-and-code-distribution.aspx"&gt;Experiences from writing sp_CascadingDataViewer – DB unit testing and code distribution&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/09/14/some-thoughts-on-visual-studio-database-references-and-how-they-should-be-used-for-sql-server-bi.aspx"&gt;Some thoughts on Visual Studio database references and how they should be used for SQL Server BI&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/08/23/microsoft-publish-visual-studio-2010-database-project-guidance.aspx"&gt;Microsoft publish Visual Studio 2010 Database Project Guidance&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/08/20/setting-up-database-unit-testing-as-part-of-a-continuous-integration-build-process-vs2010-db-tools-datadude.aspx"&gt;Setting up database unit testing as part of a Continuous Integration build process [VS2010 DB Tools - Datadude]&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/07/21/a-strategy-for-managing-security-for-different-environments-using-the-database-development-tools-in-visual-studio-2010.aspx"&gt;A strategy for managing security for different environments using the Database Development Tools in Visual Studio 2010&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h1&gt;Summing up&lt;/h1&gt;  &lt;p&gt;This has been an inordinately large blog post so if you’ve read this far – well done. For easy reference, here are all the recommendations that I have made:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Use Source Control and implement a Continuous Integration deployment &lt;/li&gt;    &lt;li&gt;Turn on Code Analysis &lt;/li&gt;    &lt;li&gt;When running your deployment in a test environment, run it more than once &lt;/li&gt;    &lt;li&gt;Maintain an automated history of your deployments &lt;/li&gt;    &lt;li&gt;Use Schema View in preference to Solution Explorer &lt;/li&gt;    &lt;li&gt;Any action in a Pre or Post-Deployment Script should use PRINT to state what has been done &lt;/li&gt;    &lt;li&gt;Output the value of all variables in your Pre-Deployment script &lt;/li&gt;    &lt;li&gt;Each database object should be defined in a dedicated file &lt;/li&gt;    &lt;li&gt;Time your deployments and output the timings &lt;/li&gt;    &lt;li&gt;All literal values should be stored in your .sqlcmdvars file &lt;/li&gt;    &lt;li&gt;Every developer should use the Isolated Dev Environment settings in order to author their code &lt;/li&gt;    &lt;li&gt;Use “Not in Build” to remove an object from your database &lt;/li&gt;    &lt;li&gt;Build and deploy to your development sandbox using scripts &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I really hope this proves useful because its taken a good long while to get it published &lt;img src="http://sqlblog.com/blogs/jamie_thomson/wlEmoticon-smile_68C424BA.png" style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile"&gt; If you have any feedback then please let me know in the comments.&lt;/p&gt;  &lt;p&gt;Thanks for reading!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@jamiet&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;* When I started writing this blog post the first sentence was “Over the past six months I have worked on two separate projects for customers that wanted to make use of Visual Studio 2010 Database projects to manage their database schema.” as opposed to what it is now: “Over the past eighteen months I have worked on four separate projects…” Yes, that’s how long its taken to write it! &lt;img src="http://sqlblog.com/blogs/jamie_thomson/wlEmoticon-smile_68C424BA.png" style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile"&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h1&gt;Appendix – An example CI configuration&lt;/h1&gt;  &lt;p&gt;&lt;i&gt;As stated above, an earlier draft of this blog post included full details of the CI configuration from one of the projects that I have worked on. Although it may repeat some of what has already been said I have included that text below.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;==============================================================&lt;/i&gt;&lt;/p&gt;  &lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;This project has invested heavily in using a Continuous Integration (CI) approach to development. What that means, succinctly, is that whenever someone checks-in some code to our source control system an automated build process is kicked off that constructs our entire system from scratch on a dedicated server. CI is not a new concept but it is fairly rare that anyone applies the same rigour to their database objects as they do to so-called “application code” (e.g. the stuff written in .Net code) and on this project we have made a conscious decision to properly build our databases as part of the CI build.&lt;/p&gt;  &lt;p&gt;Datadude employs a &lt;i&gt;declarative&lt;/i&gt; approach to database development. In other words you define what you want database schema to look like and datadude will work out what it needs to do to your target in order to turn it into what you have defined. What this means in practice is that you only ever write CREATE … DDL statements rather than IF &amp;lt;object-exists&amp;gt; THEN ALTER …ELSE CREATE … statements which is what you may have done in the past.&lt;/p&gt;  &lt;p&gt;Here’s our CI environment setup:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SubVersion (SVN) is being used for source control &lt;/li&gt;    &lt;li&gt;&lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt;, an open source CI server, is being used to orchestrate our whole CI environment. It basically monitors our SVN repository and when it spots a checked-in file, kicks off the CI build &lt;/li&gt;    &lt;li&gt;Our CI scripts (the stuff that actually does the work) are written using &lt;a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx"&gt;msbuild&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;We have 2 msbuild scripts:      &lt;ul&gt;       &lt;li&gt;Build.proj which is responsible for:          &lt;ul&gt;           &lt;li&gt;Compiling all our .Net website code &lt;/li&gt;            &lt;li&gt;Building/Compiling our datadude projects&amp;nbsp; (every datadude project file is a msbuild-compliant script) &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Deploy.proj which is responsible for:          &lt;ul&gt;           &lt;li&gt;Restoring latest database backups from our production environment into our CI environment &lt;/li&gt;            &lt;li&gt;Deploying our built datadude projects on top of those restored backups &lt;/li&gt;            &lt;li&gt;Build a folder structure to hold all the artefacts that get deployed &lt;/li&gt;            &lt;li&gt;Creating folder shares &lt;/li&gt;            &lt;li&gt;Moving SSIS packages into folder structure &lt;/li&gt;            &lt;li&gt;Deploying SSRS reports to our SSRS server &lt;/li&gt;            &lt;li&gt;Deploy our Analysis Services cube definitions to our Analysis Server &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Both Build.proj and Deploy.proj get executed by our CI build &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Building datadude projects&lt;/h2&gt;  &lt;p&gt;Datadude makes it very easy to build datadude projects in a CI environment because they are already msbuild-compliant; its simply a call to the MSBuild task, passing in the location of the solution file as an argument. We use the Release configuration (although there is no particular reason for you to do the same – purely your choice):&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:'Courier New', courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#ffffff;padding-left:5px;padding-right:5px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Database&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000;"&gt;Build database projects and copy output to staging &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;*****Building database solution&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MSBuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Projects&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;..\src\SQL\DatabaseSolution.sln&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Configuration=Release&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;That’s it! The output from a datadude build includes a number of files but the most important one is a .dbschema file which is an XML representation of all the objects in your database.&lt;/p&gt;  &lt;h2&gt;Deploying the output from a built datadude project&lt;/h2&gt;  &lt;p&gt;This is a little more difficult. We *&lt;b&gt;could&lt;/b&gt;* simply use the MSBuild task to call our deployment script as we do for build script (see above) but the problem with that is that there are many pre-requisites (including datadude itself) and we don’t want to install Visual Studio and all the assorted paraphernalia onto our various environments. Instead we chose to make use of a command-line tool called &lt;a href="http://msdn.microsoft.com/en-us/library/dd193283.aspx"&gt;VSDBCMD.exe&lt;/a&gt; to deploy datadude projects. VSDBCMD does basically the same job as what happens if you were to right-click on a datadude project in Visual Studio and select “Deploy” i.e. It compares the output of a build (A) to the target database (B) and works out what it needs to do to make B look like A. It then produces a .sql script that will actually make those requisite changes, then goes and executes it.&lt;/p&gt;  &lt;p&gt;The difficulty comes in VSDBCMD.exe having its own list of file dependencies that are listed at MSDN article &lt;a href="http://msdn.microsoft.com/en-us/library/dd193258.aspx"&gt;How to: Prepare a Database for Deployment From a Command Prompt by Using VSDBCMD.EXE&lt;/a&gt;, thankfully a much smaller list then if we were using the MSBuild task.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_334B6295.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_11EBBCF9.png" 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" alt="image" border="0" height="389" width="581"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Some of those files, namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sqlceer35en.dll &lt;/li&gt;    &lt;li&gt;Sqlceme35.dll &lt;/li&gt;    &lt;li&gt;Sqlceqp35.dll &lt;/li&gt;    &lt;li&gt;Sqlcese35.dll &lt;/li&gt;    &lt;li&gt;System.Data.SqlServerCe.dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;get installed with SQL Server CE. We bundle along the x86 &amp;amp; x64 installers for SQL Server CE along with all the rest of our deployment artefacts and then, as part of Deploy.proj, install them like so:&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:'Courier New', courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#ffffff;padding-left:5px;padding-right:5px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;'&lt;span style="color:#0000ff;"&gt;msiexec /passive /l* "$(SetupLogDirectory)\SSCERuntime_x86-ENU.log" /i "$(BuildDir)\Vendor\SSCERuntime_x86-ENU.msi"&lt;/span&gt;'&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;       &lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Condition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;$(X64)&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;'&lt;span style="color:#0000ff;"&gt;msiexec /passive /l* "$(SetupLogDirectory)\SSCERuntime_x64-ENU.log" /i "$(BuildDir)\Vendor\SSCERuntime_x64-ENU.msi"&lt;/span&gt;'&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;That takes care of some of the dependencies but we still have to take care of:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;DatabaseSchemaProviders.Extensions.xml &lt;/li&gt;    &lt;li&gt;Microsoft.Data.Schema.dll &lt;/li&gt;    &lt;li&gt;Microsoft.Data.Schema.ScriptDom.dll &lt;/li&gt;    &lt;li&gt;Microsoft.Data.Schema.ScriptDom.Sql.dll &lt;/li&gt;    &lt;li&gt;Microsoft.Data.Schema.Sql.dll &lt;/li&gt;    &lt;li&gt;Microsoft.SqlServer.BatchParser.dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;as well as the actual VSDBCMD.exe file itself. Quite simply we keep those files in SVN and then bundle them along with all our deployment artefacts (I won’t show you how we do that because its out of the scope of this post and besides if you’re at all proficient with msbuild then you’ll know how to do that and if you’re not, well, why are you reading this?)&lt;/p&gt;  &lt;p&gt;&lt;i&gt;==============================================================&lt;/i&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40711" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/UrlT8EjnSSA" height="1" width="1"/&gt;</description><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/Datadude/default.aspx">Datadude</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Continuous+Integration/default.aspx">Continuous Integration</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/DBPro/default.aspx">DBPro</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/01/implementing-sql-server-solutions-using-visual-studio-2010-database-projects-a-compendium-of-project-experiences.aspx</feedburner:origLink></item><item><title>Querying RSS feed subscriber count on Google Reader using Data Explorer‏</title><link>http://feedproxy.google.com/~r/jamiet/~3/4bFJkI1lZYA/querying-rss-feed-subscriber-count-on-google-reader-using-data-explorer.aspx</link><pubDate>Wed, 21 Dec 2011 20:29:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40583</guid><dc:creator>jamiet</dc:creator><slash:comments>3</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40583.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40583</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40583</wfw:comment><description>&lt;p&gt;I have been fiddling about with &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Data+Explorer/default.aspx" target="_blank"&gt;Data Explorer&lt;/a&gt; some more and have built an interesting little mashup that enables one to discover the number of Google Reader subscribers to &lt;a href="http://sqlblog.com/blogs/bloggers.aspx?GroupID=4"&gt;each RSS feed on SQLBlog.com&lt;/a&gt;. Before I show you how its built I'll whet your appetite with a screenshot of the output:&lt;/p&gt;  &lt;blockquote&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/excelscr_7AAF07D3.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="excelscr" border="0" alt="excelscr" src="http://sqlblog.com/blogs/jamie_thomson/excelscr_thumb_38C82285.png" width="576" height="404" /&gt;&lt;/a&gt;&lt;/blockquote&gt; For brevity I have deliberately hidden some of the results however you can see the full dataset for yourself (and see if any of the numbers have changed since I took this screenshot) by visiting &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/SQLBlog%20subscriber%20counts%20on%20Google%20Reader"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/SQLBlog%20subscriber%20counts%20on%20Google%20Reader&lt;/a&gt; and opening the data in the format of your choosing (i.e. Excel, OData or CSV). All the data is publicly available as is the mashup so you won't have any difficulty in accessing it. Opening the data yourself will also illustrate how long it takes Data Explorer to execute the mashup which, when you consider that the mashup queries the Google Reader API for data on each RSS feed in turn, could be quite interesting in itself.   &lt;br /&gt;So, how is it done? Its very simple once you know how, my mashup has four resources:   &lt;blockquote&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/resources_702E33B3.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="resources" border="0" alt="resources" src="http://sqlblog.com/blogs/jamie_thomson/resources_thumb_0447503D.png" width="398" height="281" /&gt;&lt;/a&gt;&lt;/blockquote&gt; Which we can take a look at in turn.   &lt;br /&gt;  &lt;h2&gt;Resource: StripOutCommas&lt;/h2&gt; This is simply a function that will remove commas from a string, this is important because the API that we are using returns numbers as text and any numbers greater than 999 get commas inserted. It is defined simply as:   &lt;blockquote&gt;   &lt;h3&gt;(value) =&amp;gt; Text.Replace(value,&amp;quot;,&amp;quot;,&amp;quot;&amp;quot;) &lt;/h3&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;&amp;#160;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/stripoutcommas_1BFE87A3.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="stripoutcommas" border="0" alt="stripoutcommas" src="http://sqlblog.com/blogs/jamie_thomson/stripoutcommas_thumb_466AB8C0.png" width="413" height="174" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/blockquote&gt;  &lt;h2&gt;Resource: List Of Feeds&lt;/h2&gt; Simply a list of RSS feeds for which we are going to get the subscriber count. The first task, &amp;quot;Typed list of feeds&amp;quot; , is our typed-in list of RSS feeds:   &lt;blockquote&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/listoffeeds_7A32AF11.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="listoffeeds" border="0" alt="listoffeeds" src="http://sqlblog.com/blogs/jamie_thomson/listoffeeds_thumb_6B1BD037.png" width="477" height="475" /&gt;&lt;/a&gt;&lt;/blockquote&gt;  &lt;br /&gt;The second task, &amp;quot;Convert to table&amp;quot;, does exactly what it says on the tin:   &lt;blockquote&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/converttotable_708A40DB.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="converttotable" border="0" alt="converttotable" src="http://sqlblog.com/blogs/jamie_thomson/converttotable_thumb_41C48839.png" width="381" height="350" /&gt;&lt;/a&gt;&lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;N.B. I have, by the way, complained loudly about the inability to resize columns in the Data Explorer UI.&lt;/em&gt;&lt;/p&gt;  &lt;h2&gt;Resource: GetNumberOfSubscribersForFeed&lt;/h2&gt;  &lt;p&gt;This is where the real work occurs. We are using an &lt;a href="http://blog.cartercole.com/2010/06/google-reader-subscriber-statistics-api.html"&gt;API provided by Carter Cole&lt;/a&gt; at &lt;a href="http://cartercole.com/dev/api/greaderapi.asp"&gt;http://cartercole.com/dev/api/greaderapi.asp&lt;/a&gt; that wraps the Google Reader API thus making it easy to query for number of subscribers.&lt;/p&gt;  &lt;blockquote&gt;   &lt;h3&gt;(feed) =&amp;gt; StripOutCommas(Json.Document(Web.Contents(&amp;quot;http://cartercole.com/dev/api/greaderapi.asp&amp;quot;, [Query = [feed = feed]]))[subscribers]) &lt;/h3&gt;    &lt;h3&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/getnumberofsubscribers_6E6D4212.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="getnumberofsubscribers" border="0" alt="getnumberofsubscribers" src="http://sqlblog.com/blogs/jamie_thomson/getnumberofsubscribers_thumb_1F2049BE.png" width="957" height="171" /&gt;&lt;/a&gt;&lt;/h3&gt; &lt;/blockquote&gt;  &lt;p&gt;Here I have essentially defined a function that (1) calls Carter's API, (2) passes it a parameter called feed, (3) converts the result into a JSON document, (4) extracts the &amp;quot;subscribers&amp;quot; value and (5) passes the result to StripOutCommas().&lt;/p&gt;  &lt;h2&gt;Resource: Number Of Subscribers Per Feed&lt;/h2&gt;  &lt;p&gt;This resource is what pulls everything together. Firstly the &amp;quot;Call func on each RSS feed&amp;quot; task calls our &amp;quot;GetNumberOfSubscribersForFeed&amp;quot; resource on each RSS feed in the &amp;quot;List Of Feeds&amp;quot; resource:&lt;/p&gt;  &lt;blockquote&gt;&lt;font size="4"&gt;&lt;strong&gt;Table.AddColumn(#&amp;quot;List Of Feeds&amp;quot;, &amp;quot;NumberOfSubscribers&amp;quot;, each GetNumberOfSubscribersForFeed([feed]))&lt;/strong&gt;&lt;/font&gt;     &lt;br /&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/numberofsubscribersperfeed_4BC90397.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="numberofsubscribersperfeed" border="0" alt="numberofsubscribersperfeed" src="http://sqlblog.com/blogs/jamie_thomson/numberofsubscribersperfeed_thumb_43D16135.png" width="742" height="213" /&gt;&lt;/a&gt;&lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;The &amp;quot;Rename column&amp;quot;, &amp;quot;Convert Text to Integer&amp;quot; &amp;amp; &amp;quot;Sort Subscribers DESC&amp;quot; tasks are, hopefully, self-explanatory.&lt;/p&gt;  &lt;h2&gt;Consume&lt;/h2&gt;  &lt;p&gt;And that's it! As already stated the mashup has been published at &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/SQLBlog%20subscriber%20counts%20on%20Google%20Reader"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/SQLBlog%20subscriber%20counts%20on%20Google%20Reader&lt;/a&gt; from where you can:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download the mashup output as a CSV file &lt;/li&gt;    &lt;li&gt;Download the mashup output as an Excel document &lt;/li&gt;    &lt;li&gt;Download the mashup itself so you can play with it at your leisure &lt;/li&gt;    &lt;li&gt;View the output in an &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/SQLBlog%20subscriber%20counts%20on%20Google%20Reader/Feed/Number%20of%20Subscribers%20per%20feed" target="_blank"&gt;OData feed&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/downloadsite_707A1B0E.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="downloadsite" border="0" alt="downloadsite" src="http://sqlblog.com/blogs/jamie_thomson/downloadsite_thumb_361EA52D.png" width="560" height="497" /&gt;&lt;/a&gt;&lt;/blockquote&gt;  &lt;p&gt;If you want to use the mashup to get similar counts for your own set of RSS feeds simply change the &amp;quot;List of Feeds&amp;quot; resource appropriately. Happy data exploring!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40583" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/4bFJkI1lZYA" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Data+Explorer/default.aspx">Data Explorer</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/21/querying-rss-feed-subscriber-count-on-google-reader-using-data-explorer.aspx</feedburner:origLink></item><item><title>ExcelMashup.com now has a dedicated forum</title><link>http://feedproxy.google.com/~r/jamiet/~3/uUVGGlUWOMA/excelmashup-com-now-has-a-dedicated-forum.aspx</link><pubDate>Mon, 19 Dec 2011 10:42:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40512</guid><dc:creator>jamiet</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40512.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40512</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40512</wfw:comment><description>&lt;p&gt;Five days ago I published a fairly scathing attack on the folks that built &lt;a href="http://www.ExcelMashup.com" target="_blank"&gt;ExcelMashup.com&lt;/a&gt; due to their poor support for folks that wanted to provide feedback. Well, credit where credit is due, they have been pretty quick to respond as I have been informed that &lt;a href="http://www.excelmashup.com/Content/Forums.html" target="_blank"&gt;the site has been updated&lt;/a&gt; with a link to the dedicated forum which is hosted on &lt;a href="http://answers.microsoft.com/en-us/office/forum/webapps-excel" target="_blank"&gt;Microsoft Answers&lt;/a&gt;. In an offline email exchange I promised them that if they did the right thing then I would update my blog accordingly, hence the post that you are reading right now.&lt;/p&gt;&lt;p&gt;Note that I do not know whether or not they have started responding to the email alias mentioned at &lt;a href="http://www.excelmashup.com/Content/Community.html" target="_blank"&gt;http://www.excelmashup.com/Content/Community.html&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40512" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/uUVGGlUWOMA" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/ExcelMashup/default.aspx">ExcelMashup</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/19/excelmashup-com-now-has-a-dedicated-forum.aspx</feedburner:origLink></item><item><title>Thoughts on ExcelMashup.com (and a rant)</title><link>http://feedproxy.google.com/~r/jamiet/~3/YfhZdeYHoMU/thoughts-on-excelmashup-com-and-a-rant.aspx</link><pubDate>Wed, 14 Dec 2011 18:46:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40394</guid><dc:creator>jamiet</dc:creator><slash:comments>13</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40394.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40394</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40394</wfw:comment><description>&lt;p&gt;Microsoft last week made available a new website called &lt;a href="http://www.excelmashup.com/"&gt;ExcelMashup.com&lt;/a&gt; and Chris Webb &lt;a href="https://twitter.com/#%21/Technitrain/status/145986138505609217"&gt;tweeted me&lt;/a&gt; exclaiming:&lt;/p&gt;
  
&lt;blockquote&gt;&lt;i&gt;"Excel Mashup: &lt;/i&gt;&lt;a href="http://t.co/USTdqhFh"&gt;&lt;i&gt;http://bit.ly/uvvFxy&lt;/i&gt;&lt;/a&gt;&lt;i&gt; - so, &lt;/i&gt;&lt;a href="https://twitter.com/#%21/jamiet"&gt;&lt;i&gt;@&lt;b&gt;jamiet&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;, we've got the Excel Services API but no OData unfortunately...?"&lt;/i&gt;&lt;/blockquote&gt;
 If you have followed &lt;a href="http://cwebbbi.wordpress.com/"&gt;Chris' blog&lt;/a&gt; and my own of late you may know that the need to easily extract data out of Excel spreadsheets has become a personal crusade of ours lately, for evidence check the following:   
&lt;ul&gt;   
&lt;li&gt;&lt;a href="http://answers.microsoft.com/en-us/office/forum/webapps-excel/excel-web-app-api/eaa565f1-83b6-4e7c-a1ec-af31fc3d7a73"&gt;Excel Web App API?&lt;/a&gt; (A forum post) &lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://cwebbbi.wordpress.com/2010/07/02/the-excel-web-app-and-its-missing-api/"&gt;The Excel Web App and its missing API&lt;/a&gt; (A blog post from Chris) &lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2009/06/23/enterprise-mashups.aspx"&gt;Enterprise Mashups&lt;/a&gt; (A blog post by me) &lt;/li&gt;
 &lt;/ul&gt;
 In his blog post Chris summarises quite nicely what we would like to see in terms of an API on top of the &lt;a href="https://skydrive.live.com/?sc=documents"&gt;Excel Web Apps&lt;/a&gt;:   
&lt;blockquote&gt;&lt;i&gt;what I’d like to see is the Excel Web App be able to do the following: &lt;/i&gt;    
&lt;ul&gt;     
&lt;li&gt;&lt;i&gt;Consume data from multiple data source types, such as OData, and display that data in a table &lt;/i&gt;&lt;/li&gt;
      
&lt;li&gt;&lt;i&gt;Expose the data in a range or a table as an OData feed&lt;/i&gt; &lt;/li&gt;
   &lt;/ul&gt;
 &lt;/blockquote&gt;
  
&lt;p&gt;   &lt;br&gt;My take on it: I simply want to make data [consumable from/producable into] Excel in a manner that is &lt;strike&gt;consumer&lt;/strike&gt;user-agnostic.     &lt;br&gt;&lt;/p&gt;
  
&lt;p&gt;Hence then why Chris tweeted me that link - an API for Excel that uses files on SkyDrive (which is what &lt;a href="http://www.excelmashup.com/"&gt;ExcelMashup.com&lt;/a&gt; talks about) certainly sounded promising. Unfortunately it seems ExcelMashup.com is not what we hoped it would be - it is a JavaScript API and hence intended for pulling data out of an Excel spreadsheet and displaying it on a website. There's nothing wrong with that of course but it does not cover any of the &lt;a href="http://answers.microsoft.com/en-us/office/forum/webapps-excel/excel-web-app-api/eaa565f1-83b6-4e7c-a1ec-af31fc3d7a73"&gt;scenarios&lt;/a&gt; that Chris and I are interested in and frankly that is a rather disappointing. To sum up, as &lt;a href="http://mikelev.in/"&gt;Mike Levin&lt;/a&gt; on the &lt;a href="http://answers.microsoft.com/en-us/office/forum/webapps-excel/excel-web-app-api/eaa565f1-83b6-4e7c-a1ec-af31fc3d7a73"&gt;forum thread &lt;/a&gt;says: &lt;/p&gt;
  
&lt;blockquote&gt;&lt;i&gt;A web-based spreadsheet without an easily accessed API amounts to cutting it off from the world of data around it. I do mashups against Google Spreadsheets all the time, and came over here looking to port the work, and make it Web-spreadsheet agnostic.      &lt;br&gt;I'm disappointed. Just give me a credentials system and a REST API. I see the reference to having this in Sharepoint, but is there a lightweight way to do it? With login credentials and a restful API, we woudn't even need client libraries, Sharepoint, or any such software overhead. Just use the language of your choice, and bang against the spreadsheet.&lt;/i&gt;&lt;/blockquote&gt;
  
&lt;p&gt;ExcelMashup.com simply does not provide what Mike is after, and that is disappointing.&lt;/p&gt;
  
&lt;p&gt;I decided it would be right and proper to give the above feedback to the team behind ExcelMashup.com so I headed to &lt;a href="http://www.excelmashup.com/Content/Forums.html"&gt;http://www.excelmashup.com/Content/Forums.html&lt;/a&gt; to see this: &lt;/p&gt;
  
&lt;blockquote&gt;   
&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_4B88DC03.png"&gt;&lt;img src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_37FB7C62.png" style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" alt="image" border="0" height="318" width="626"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
 &lt;/blockquote&gt;
  
&lt;p&gt;Very strange, none of the forums have got anything to do with “Excel Mashup”, instead all but one of them seem related to Sharepoint which, in this context, I have no interest in. Undeterred I headed to the &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sharepoint2010general/threads"&gt;Sharepoint 2010 General Questions and Answers forum&lt;/a&gt; where &lt;a href="http://social.microsoft.com/Forums/en-US/Offtopic/thread/1c082a4e-6838-4e82-99da-21d74d7bcff2/" target="_blank"&gt;I posted&lt;/a&gt; the following:&lt;/p&gt;
  
&lt;blockquote&gt;   
&lt;p&gt;&lt;i&gt;&lt;b&gt;ExcelMashup.com - Where is the forum?&lt;/b&gt;         &lt;br&gt;Hello,         &lt;br&gt;I was browsing http://www.excelmashup.com/Content/Forums.html to discover where to go to ask questions about excelmashup.com and the forum that I am posting this to seemed the most appropriate. Its still not a forum dedicated to excelmashup.com though - does such a forum exist?         &lt;br&gt;I have lots of questions that I would like to ask about excelmashup.com but I'm not going to waste my time firing off questions to non-relevant forum. &lt;/i&gt;&lt;/p&gt;
    
&lt;p&gt;&lt;i&gt;       &lt;br&gt;regards         &lt;br&gt;Jamie&lt;/i&gt;&lt;/p&gt;
 &lt;/blockquote&gt;
  
&lt;p&gt;I thought that was pretty fair - they haven't provided a link to a relevant forum so I wanted to know if such a forum existed. Apparently though a Microsoft employee didn't agree with me because the thread has been moved to the &lt;a href="http://social.microsoft.com/Forums/en-US/Offtopic/threads"&gt;Off-Topic Posts (Do Not Post Here) forum&lt;/a&gt;. Say what? I post a forum thread related to ExcelMashup.com on a forum that ExcelMashup.com advises me to post on and that thread gets moved to the "F off and stop bothering us" bucket? Are you fricking kidding me? In addition to that facepalm I also sent an email to docthis@microsoft.com (as advised at &lt;a href="http://www.excelmashup.com/Content/Community.html" target="_blank"&gt;http://www.excelmashup.com/Content/Community.html&lt;/a&gt;) saying exactly the same as on my forum thread. That was two days ago and I haven't yet received a reply. &lt;/p&gt;
  
&lt;p&gt;   &lt;br&gt;OK, I can accept the fact that ExcelMashup doesn't have any use for me - I have no issue with that. What angers me is that the site has been put out for customers to use and then promptly disregarded. There is no dedicated forum, they're clearly not monitoring the forums that they provide links to, Microsoft support folks clearly have no idea what ExcelMashup is and instead are soft-deleting any forum thread related to it and to top it all the ExcelMashup team aren't bothering to respond to emails sent to the email address that they provide a link to. &lt;/p&gt;
  
&lt;p&gt;   &lt;br&gt;I don't know why they didn't just put a logo showing big two-fingered salute on their website instead just to save us all the bother!     &lt;br&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;UPDATE, 19th December 2011:&amp;nbsp; I have been informed by Cyrielle Simeone in the comments below that ExcelMashup.com has been updated in light of my comments and now has a specific forum for ExcelMashup.com at &lt;a href="http://answers.microsoft.com/en-us/office/forum/webapps-excel" target="_blank"&gt;Microsoft Answers&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40394" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/YfhZdeYHoMU" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/ExcelMashup/default.aspx">ExcelMashup</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/14/thoughts-on-excelmashup-com-and-a-rant.aspx</feedburner:origLink></item><item><title>Data Explorer Feedback part 1</title><link>http://feedproxy.google.com/~r/jamiet/~3/Fb7_dDDn0mY/data-explorer-feedback-part-1.aspx</link><pubDate>Wed, 07 Dec 2011 20:56:56 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40196</guid><dc:creator>jamiet</dc:creator><slash:comments>7</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40196.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40196</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40196</wfw:comment><description>&lt;p&gt;Earlier today I posted &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/07/data-explorer-walkthrough-parsing-a-twitter-list.aspx"&gt;Data Explorer walkthrough – Parsing a Twitter list&lt;/a&gt; in which I explained that I have been using Data Explorer for a few weeks now. In that time I have been compiling some feedback for the Data Explorer product team which I was going to email privately but I see no harm in putting these thoughts into the public domain, hence why I am writing this blog post – a hodge podge of thoughts/suggestions/gripes from the past few weeks of using Data Explorer.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I’m very impressed that if I change the name of a resources any references to that resource are updated accordingly. After years of working with the SSIS dev tools I’m automatically wired to expect that &lt;em&gt;not&lt;/em&gt; to work. &lt;/li&gt;    &lt;li&gt;I love the composability of tasks and resources (e.g. Define a custom function as a resource and use it in another resource). That idea of composability and reuse is something that is sadly lacking in SSIS (and the SSIS team know that because I’ve moaned about it often enough &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://sqlblog.com/blogs/jamie_thomson/wlEmoticon-smile_0F86EC0C.png" /&gt; ). &lt;/li&gt;    &lt;li&gt;If the name of the resource is too large for the box then there is no way to see the full name without editing it: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_67E06FE1.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_18FFAA82.png" width="244" height="178" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;It would be nice to be able to reorder the list of resources &lt;/li&gt;    &lt;li&gt;We *really* need the ability to widen the columns when viewing the results of a task. &lt;/li&gt;    &lt;li&gt;Data Explorer seems a bit lacking in its abilities to parse HTML &amp;amp; XML right now. For example, I'm surprised that I can't use XPath to extract the contents of an HTML/XML document. In fact, the lack of such features is the most disappointing aspect of Data Explorer thus far and means that the product is still a long way off being a &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2009/07/08/kapow-etl-for-html.aspx" target="_blank"&gt;Kapow&lt;/a&gt; competitor, remembering that this is still an early beta of course. &lt;/li&gt;    &lt;li&gt;We need better ways of visualising the output from a mashup (i.e. something that doesn’t require the user to have Excel installed). How about giving SSRS the ability to consume an OData feed – we could then host such a report on SQL Azure Reporting, perhaps even sell that report via the Azure Marketplace. &lt;/li&gt;    &lt;li&gt;If I make a mashup publicly available I would like to be able to know how many times it is called. I believe that the ability to INSERT data (e.g. into SQL Azure) using Data Explorer will be coming soon (its kind of already there with the Snapshot feature) so I'm wondering if there is a way to &amp;quot;trigger&amp;quot; an insertion when someone consumes one of my exposed resources? I suspect the answer is &amp;quot;not right now&amp;quot; so consider that a feature request. I guess you could crystalise that request as &amp;quot;Provide an eventing model within a mashup so that resources can be triggered when some event (e.g. Someone consumes a resource) occurs.&amp;quot; &lt;/li&gt;    &lt;li&gt;We need a scheduler that enables us to run Snapshots at some pre-defined time. &lt;/li&gt;    &lt;li&gt;I have a mashup published at &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo&lt;/a&gt;. The link for the feed is &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed&lt;/a&gt; but that doesn’t actually show me any data, it shows me a list of resources that produce the data however in this case there is only one resource (&lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed/jamiet-dataexplorer-text_user_screen_name"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed/jamiet-dataexplorer-text_user_screen_name&lt;/a&gt;). Would it not make sense to link directly to the feed with data in it if there is only actually one external resource in my mashup? It would save a mouse-click at least. &lt;/li&gt;    &lt;li&gt;I haven’t yet figured out if its possible to do recursion. Still working on that one. &lt;/li&gt;    &lt;li&gt;In my &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/07/data-explorer-walkthrough-parsing-a-twitter-list.aspx" target="_blank"&gt;Twitter List example&lt;/a&gt; the values “jamiet” &amp;amp; “data-explorer” for the list owner and list slug respectively were hardcoded in the mashup; yes, they were parameters to a function but they were still hardcoded. It would have been much better if I were able to give the consumer of the mashup the ability to define/override those values when they consume it. In other words, a mashup needs to be parameterizable.&lt;/li&gt;    &lt;li&gt;Overall I am very impressed and the excitement that I displayed in my initial post &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/10/24/thoughts-on-data-explorer.aspx" target="_blank"&gt;Thoughts on Data Explorer&lt;/a&gt; is justified. Data Explorer coalesces nicely with existing interests of mine such as SQL Server, ETL &amp;amp; web-enabled data and I have high hopes that I will be using this extensively for clients in the years to come. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40196" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/Fb7_dDDn0mY" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Data+Explorer/default.aspx">Data Explorer</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/07/data-explorer-feedback-part-1.aspx</feedburner:origLink></item><item><title>Data Explorer walkthrough – Parsing a Twitter list</title><link>http://feedproxy.google.com/~r/jamiet/~3/rI7tehjco5Y/data-explorer-walkthrough-parsing-a-twitter-list.aspx</link><pubDate>Wed, 07 Dec 2011 13:40:21 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40182</guid><dc:creator>jamiet</dc:creator><slash:comments>11</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40182.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40182</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40182</wfw:comment><description>&lt;p&gt;Yesterday the public availability of Data Explorer, a new data mashup tool from the SQL Server team, was announced at &lt;a href="http://blogs.msdn.com/b/dataexplorer/archive/2011/12/06/announcing-the-labs-release-of-microsoft-codename-data-explorer.aspx" target="_blank"&gt;Announcing the Labs release of Microsoft Codename “Data Explorer”&lt;/a&gt;. Upon seeing the first public demos of Data Explorer at SQL Pass 2011 I published a blog post &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/10/24/thoughts-on-data-explorer.aspx" target="_blank"&gt;Thoughts on Data Explorer&lt;/a&gt; which must have caught someone’s attention because soon after I was lucky enough to be invited onto an early preview of Data Explorer, hence I have spent the past few weeks familiarising myself with it. In this blog post I am going to demonstrate how one can use Data Explorer to consume and parse a Twitter list.&lt;/p&gt;  &lt;p&gt;I have set up a list specifically for this demo and suitably it is a list of tweeters that tweet about Data Explorer – you can view the list at &lt;a title="http://twitter.com/#!/list/jamiet/data-explorer" href="http://twitter.com/#!/list/jamiet/data-explorer" target="_blank"&gt;http://twitter.com/#!/list/jamiet/data-explorer&lt;/a&gt;. Note that some of the screenshots in this blog post were taken prior to the public release and many of them have been altered slightly since then; with that in mind, here we go.&lt;/p&gt;  &lt;p&gt;First, browse to &lt;a title="https://dataexplorer.sqlazurelabs.com/" href="https://dataexplorer.sqlazurelabs.com/"&gt;https://dataexplorer.sqlazurelabs.com/&lt;/a&gt; and log in &lt;/p&gt;  &lt;p&gt;When logged in select New to create a new mashup &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_084C85EF.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_2722F9CD.png" width="654" height="123" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Give your mashup a suitable name &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5AEAF01E.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_13296737.png" width="318" height="89" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You will be shown some options for consuming a source of data. Click on Formula&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_0B31C4D5.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_5F80FAD8.png" width="61" height="62" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We’re going to be good web citizens and use &lt;a href="http://json.org/" target="_blank"&gt;JSON&lt;/a&gt; rather than XML to return data from our list. The URI for our Twitter API call is &lt;a title="https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet" href="https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet" target="_blank"&gt;https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet&lt;/a&gt;, note how I have specified the list owner (&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;me&lt;/a&gt;) and the name of the list (what they call the slug) “data-explorer” as query parameters. If you go to that URL in your browser then you will be prompted to save a file containing the returned JSON document which, if all you want to do is see the document, isn’t very useful. In debugging my mashups I have found a service called &lt;a href="http://jsonformatter.curiousconcept.com" target="_blank"&gt;JSON Formatter&lt;/a&gt; to be invaluable because it allows us to see the contents of a JSON document by supplying the URI of that document as a parameter like so: &lt;a title="http://jsonformatter.curiousconcept.com/#https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet" href="http://jsonformatter.curiousconcept.com/#https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet" target="_blank"&gt;http://jsonformatter.curiousconcept.com/#https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet&lt;/a&gt;. It might be useful to keep that site open in a separate window as you attempt to build the mashup below.&lt;/p&gt;  &lt;p&gt;I’ve digressed a little, let’s get back to our mashup. We’re going to use a function called &lt;font face="Consolas"&gt;Web.Contents()&lt;/font&gt; to consume the contents of the Twitter API call and pass the results into another function, &lt;font face="Consolas"&gt;Json.Document()&lt;/font&gt;, which parses the JSON document for us. The full formula is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= Json.Document(Web.Contents(“&lt;a href="https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet"&gt;https://api.twitter.com/1/lists/statuses.json?slug=&lt;strong&gt;data-explorer&lt;/strong&gt;&amp;amp;owner_screen_name=&lt;strong&gt;jamiet&lt;/strong&gt;&lt;/a&gt;”))&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_17BF71F1.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0189569F.png" width="1048" height="48" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;When you type in that formula and simply hit enter you’re probably going to be faced with this screen:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5C1F6330.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_5ADACA51.png" width="642" height="395" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Its asking you how you want to authenticate with the Twitter API. Calls to the &lt;a href="https://api.twitter.com/1/lists/statuses.json"&gt;https://api.twitter.com/1/lists/statuses.json&lt;/a&gt; resource don’t require authentication so anonymous access is fine, just hit continue. When you do you will see something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_325BE83D.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_4A131FA3.png" width="906" height="256" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The icon&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_76BBD97C.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0F4B76CD.png" width="40" height="30" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;essentially indicates a dataset, so each record of these results is in itself another dataset. We’ll come onto how we further parse all of this later on but before we do we should clean up our existing formula so that we’re not hardcoding the values “data-explorer” and “jamiet”.&lt;/p&gt;  &lt;p&gt;The &lt;font face="Consolas"&gt;Web.Contents()&lt;/font&gt; function possesses the ability to specify named parameters rather than including them in the full URL. Change the formula to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= Json.Document(Web.Contents(&amp;quot;&lt;/font&gt;&lt;a href="https://api.twitter.com/1/lists/statuses.json&amp;quot;"&gt;&lt;font face="Consolas"&gt;https://api.twitter.com/1/lists/statuses.json&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt;, [Query = [slug=&amp;quot;data-explorer&amp;quot;, owner_screen_name=&amp;quot;jamiet&amp;quot;] ]))&lt;/font&gt; :&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_4EA92A5D.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_38730F0B.png" width="1125" height="37" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That will return the same result as before but now we’ve broken out the query parameters {slug, owner_screen_name} into parameters of &lt;font face="Consolas"&gt;Web.Contents()&lt;/font&gt;. That’s kinda nice but they’re still hardcoded; instead what we want to do is turn the whole formula into a callable function, we do that by specifying a function signature and including the parameters of the signature in the formula like so:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= (slug,owner_screen_name) =&amp;gt; Json.Document(Web.Contents(&amp;quot;&lt;/font&gt;&lt;a href="https://api.twitter.com/1/lists/statuses.json&amp;quot;"&gt;&lt;font face="Consolas"&gt;https://api.twitter.com/1/lists/statuses.json&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt;, [Query = [slug=slug, owner_screen_name=owner_screen_name] ]))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_13091B9D.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_11C482BE.png" width="1222" height="75" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Let’s give our new function a more meaningful name by right-clicking on the resource name which is currently set as “Custom1” and renaming it as “GetTwitterList”:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_6945A0A9.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_1A64DB4A.png" width="230" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_203F7EE3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_1194D2FE.png" width="231" height="68" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We have now defined a new function within our mashup called &lt;font face="Consolas"&gt;GetTwitterList(slug, owner_screen_name)&lt;/font&gt; that we can call as if it were a built-in function.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_70A16056.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_2F26ADFD.png" width="774" height="309" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Let’s create a new resource as a formula that uses our new custom function and pass it some parameter values:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= GetTwitterList(&amp;quot;data-explorer&amp;quot;, &amp;quot;jamiet&amp;quot;)&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_54B02B5E.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_4CB888FC.png" width="413" height="355" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We still have the same results but now via a nice neat function that abstracts away the complexity of &lt;font face="Consolas"&gt;Json.Document( Web.Contents() )&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;As stated earlier each of the records is in itself a dataset each of which, in this case, represents lots of information about a single tweet. We can go a long way to parsing out the information using a function called &lt;font face="Consolas"&gt;IntoTable() &lt;/font&gt;that takes a dataset and converts it into a table of values:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_274E958E.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_6A4A63FB.png" width="715" height="211" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is the result of applying &lt;font face="Consolas"&gt;IntoTable()&lt;/font&gt; to the results of &lt;font face="Consolas"&gt;GetTwitterlist()&lt;/font&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_56BD045A.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_47A62580.png" width="780" height="373" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is much more useful, we can now see lots of information about each tweet however notice that information about the user who wrote the tweet is wrapped up in yet another nested dataset called “user”. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;All the time note how whatever data we are seeing and whatever we do to that data via the graphical UIs is always reflected in the formula bar; in the screenshot immediately above notice that we are selecting the “user” and “text” columns (the checkbox for “user” is off the screen but is checked).&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We can now parse out the user’s screen_name using a different function – AddColumn(). AddColumn() taken an input and allows us to define a new column (in this case called “user-screen_name”) and specify an expression for that column based on the input. A picture speaks a thousand words so:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= Table.AddColumn(intoTable, &amp;quot;user_screen_name&amp;quot;, each [user][screen_name])&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_2CF98967.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_44B0C0CD.png" width="615" height="396" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There we have our new column, user_screen_name, containing the name of the tweeter that tweeted the tweet. At this point let’s take a look at the &lt;a href="http://jsonformatter.curiousconcept.com/#https://api.twitter.com/1/lists/statuses.json?slug=data-explorer&amp;amp;owner_screen_name=jamiet"&gt;raw JSON&lt;/a&gt; to see where this got parsed out from:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_17BB5DF2.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_55D478A3.png" width="673" height="625" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice that the screen_name, UserEd_, is embedded 3 levels deep within the hierarchical JSON document.&lt;/p&gt;  &lt;p&gt;We’re almost there now. The final step is to use the function &lt;font face="Consolas"&gt;SelectColumns()&lt;/font&gt; to select the subset of columns that we are interested in::&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;= Table.SelectColumns(InsertedCustom,{&amp;quot;text&amp;quot;, &amp;quot;user_screen_name&amp;quot;})&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_6D1F7D14.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_4BBFD778.png" width="593" height="370" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Which gives us our final result:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_31133B5F.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_48CA72C5.png" width="512" height="410" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;At this point hit the Save button:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_5C0B2964.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_0D2A6405.png" width="216" height="110" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;OK, so we have a mashup that pulls some data out of twitter, parses it and then….well…nothing! It doesn’t actually &lt;em&gt;do &lt;/em&gt;anything with that data.&amp;#160; We have to &lt;em&gt;publish&lt;/em&gt; the mashup so that it can be consumed and we do that by heading back to the home page (which is referred to as “My Workspace”) by clicking the My Workspace button near the top of the page:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_1305079E.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin: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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_122CA1B4.png" width="130" height="37" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Back in My Workspace you can select your newly created mashup (by clicking on it) and options Preview, Snapshot &amp;amp; Publish appear:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_434BDC54.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_225869AD.png" width="381" height="180" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We’ll ignore Preview and Snapshot for now, hit the Publish button instead at which point we are prompted for a name that we will publish the mashup as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_15EA4684.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" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_06D367AA.png" width="500" height="235" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hitting Publish will do the necessary and make our data feed available at a public URI:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_176B6298.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_649B5C23.png" width="641" height="78" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Head to that URL (&lt;a title="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo" href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo&lt;/a&gt;) and here’s what you see:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_7129093F.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_6139C47B.png" width="571" height="526" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can download the mashup output as a CSV file or an Excel workbook. You can also download the whole mashup so you can edit it as you see fit and, most importantly, you can access the output of the mashup via an OData feed at &lt;a title="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed/jamiet-dataexplorer-text_user_screen_name" href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed/jamiet-dataexplorer-text_user_screen_name"&gt;https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/Feed/jamiet-dataexplorer-text_user_screen_name&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We have used Data Explorer’s JSON parsing and dataset navigation abilities to pull out the data that we are interested in and present it in a neat rectangular data structure that we are familiar with. Moreover we have done it without installing any software and we have made that data accessible via an open protocol; that’s pretty powerful and, in my wholly worthless opinion, very cool indeed.&lt;/p&gt;  &lt;p&gt;Have fun playing with Data Explorer. Feel free to &lt;a href="https://ws41451459.dataexplorer.sqlazurelabs.com/Published/TwitterListDemo/ResultsInLinkedFormat" target="_blank"&gt;download my Twitter List Demo mashup&lt;/a&gt; and mess about with it to your heart’s content.&lt;/p&gt;  &lt;p&gt;               &lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@jamiet&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40182" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/rI7tehjco5Y" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/twitter/default.aspx">twitter</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Data+Explorer/default.aspx">Data Explorer</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/12/07/data-explorer-walkthrough-parsing-a-twitter-list.aspx</feedburner:origLink></item><item><title>SQL Server Configuration timeouts - and a workaround [SSIS]</title><link>http://feedproxy.google.com/~r/jamiet/~3/Fa3pQTtzI24/sql-server-configuration-timeouts-and-a-workaround-ssis.aspx</link><pubDate>Wed, 30 Nov 2011 21:43:33 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40082</guid><dc:creator>jamiet</dc:creator><slash:comments>6</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/40082.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=40082</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=40082</wfw:comment><description>&lt;p&gt;Ever since I started writing SSIS packages &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2004/11/03/Article-on-SQLIS.com.aspx" target="_blank"&gt;back in 2004&lt;/a&gt; I have opted to store configurations in .dtsConfig (.i.e. XML) files rather than in a SQL Server table (aka SQL Server Configurations) however recently I inherited some packages that used SQL Server Configurations and thus had to immerse myself in their murky little world. To all the people that have ever gone onto the SSIS forum and asked questions about ambiguous behaviour of SQL Server Configurations I now say this... &lt;i&gt;I feel your pain&lt;/i&gt;!&lt;/p&gt;  &lt;p&gt;The biggest problem I have had was in dealing with the change to the order in which configurations get applied that came about in SSIS 2008. Those changes are detailed on MSDN at &lt;a href="http://msdn.microsoft.com/en-us/library/ms141682.aspx" target="_blank"&gt;SSIS Package Configurations&lt;/a&gt; however the pertinent bits are:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;As the utility loads and runs the package, events occur in the following order:&lt;/em&gt;&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;em&gt;The &lt;b&gt;dtexec&lt;/b&gt; utility loads the package. &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;The utility applies the configurations that were specified in the package at design time and in the order that is specified in the package. (The one exception to this is the Parent Package Variables configurations. The utility applies these configurations only once and later in the process.) &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;The utility then applies any options that you specified on the command line. &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;The utility then reloads the configurations that were specified in the package at design time and in the order specified in the package. (Again, the exception to this rule is the Parent Package Variables configurations). The utility uses any command-line options that were specified to reload the configurations. Therefore, different values might be reloaded from a different location. &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;The utility applies the Parent Package Variable configurations. &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;The utility runs the packa&lt;/em&gt;&lt;em&gt;ge.&lt;/em&gt; &lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;To understand how these steps differ from SSIS 2005 I recommend reading Doug Laudenschlager’s blog post &lt;a href="http://dougbert.com/blogs/dougbert/archive/2009/04/07/understand-how-ssis-package-configurations-are-applied.aspx" target="_blank"&gt;Understand how SSIS package configurations are applied&lt;/a&gt;.&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;The very nature of SQL Server Configurations means that the Connection String for the database holding the configuration values needs to be supplied from the command-line. Typically then the call to execute your package resembles this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="consolas"&gt;dtexec /FILE Package.dtsx /SET &amp;quot;\Package.Connections[SSISConfigurations].Properties[ConnectionString]&amp;quot;;&amp;quot;\&amp;quot;Data Source=SomeServer;Initial Catalog=SomeDB;Integrated Security=SSPI;\&amp;quot;&amp;quot;, &lt;/font&gt;      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The problem then is that, as per the steps above, the package will (1) attempt to apply all configurations using the Connection String stored in the package for the &amp;quot;SSISConfigurations&amp;quot; Connection Manager before then (2) applying the Connection String from the command-line and then (3) apply the same configurations all over again. In the packages that I inherited that first attempt to apply the configurations would timeout (not unexpected); I had 8 SQL Server Configurations in the package and thus the package was waiting for 2 minutes until all the Configurations timed out (i.e. 15seconds per Configuration) - in a package that only executes for ~8seconds when it gets to do its actual work a delay of 2minutes was simply unacceptable.&lt;/p&gt;  &lt;p&gt;We had three options in how to deal with this:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Get rid of the use of SQL Server configurations and use .dtsConfig files instead &lt;/li&gt;    &lt;li&gt;Edit the packages when they get deployed &lt;/li&gt;    &lt;li&gt;Change the timeout on the &amp;quot;SSISConfigurations&amp;quot; Connection Manager &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;#1 was my preferred choice but, for reasons I explain below*, wasn't an option in this particular instance. #2 was discounted out of hand because it negates the point of using Configurations in the first place. This left us with #3 - change the timeout on the Connection Manager. This is done by going into the properties of the Connection Manager, opening the &amp;quot;All&amp;quot; tab and changing the &lt;font face="Consolas"&gt;Connect Timeout&lt;/font&gt; property to some suitable value (in the screenshot below I chose 2 seconds).     &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/connman_1EB77315.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="connman" border="0" alt="connman" src="http://sqlblog.com/blogs/jamie_thomson/connman_thumb_2F4F6E03.png" width="528" height="546" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This change meant that the attempts to apply the SQL Server configurations timed out in 16 seconds rather than two minutes; clearly this isn't an optimum solution but its certainly better than it was.&lt;/p&gt;  &lt;p&gt;So there you have it - if you are having problems with SQL Server configuration timeouts within SSIS try changing the timeout of the Connection Manager. Better still - don't bother using SQL Server Configuration in the first place. Even better - install &lt;a href="http://www.microsoft.com/sqlserver/en/us/future-editions.aspx" target="_blank"&gt;RC0 of SQL Server 2012&lt;/a&gt; to start leveraging &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/11/11/parameters-in-ssis-in-denali.aspx" target="_blank"&gt;SSIS parameters&lt;/a&gt; and leave the nasty old world of configurations behind you.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;* Basically, we are leveraging a SSIS execution/logging framework in which the client had invested a lot of resources and SQL Server Configurations are an integral part of that.     &lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=40082" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/Fa3pQTtzI24" height="1" width="1"/&gt;</description><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+2008/default.aspx">sql server 2008</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><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/configurations/default.aspx">configurations</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/11/30/sql-server-configuration-timeouts-and-a-workaround-ssis.aspx</feedburner:origLink></item><item><title>Workaround for datadude deployment bug - NullReferenceException</title><link>http://feedproxy.google.com/~r/jamiet/~3/RyKm8ZMvQ7E/workaround-for-datadude-deployment-bug.aspx</link><pubDate>Mon, 21 Nov 2011 08:56:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:39903</guid><dc:creator>jamiet</dc:creator><slash:comments>3</slash:comments><comments>http://sqlblog.com/blogs/jamie_thomson/comments/39903.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/jamie_thomson/commentrss.aspx?PostID=39903</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/jamie_thomson/rsscomments.aspx?PostID=39903</wfw:comment><description>&lt;p&gt;I have come across a bug in Visual Studio 2010 Database Projects (&lt;a href="http://www.sqlservercentral.com/questions/tags/visual+studio/" target="_blank"&gt;aka datadude aka DPro aka Visual Studio Database Development Tools aka Visual Studio Team Edition for Database Professionals aka Juneau aka SQL Server Data Tools&lt;/a&gt;) that other people may encounter so, for the purposes of googling, I'm writing this blog post about it. Through my own googling I discovered that a Connect bug had already been raised about it (&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/693158/vs2010-database-project-deploy-sqldeploytask-task-failed-unexpectedly-nullreferenceexception#details" target="_blank"&gt;VS2010 Database project deploy - “SqlDeployTask” task failed unexpectedly, NullReferenceException&lt;/a&gt;), and coincidentally enough it was raised by my former colleague Tom Hunter (whom I have &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/11/25/sql-server-2008-sp1-cu-6-includes-small-changes-to-dtsx-files.aspx" target="_blank"&gt;mentioned here before as the superhuman Tom Hunter&lt;/a&gt;) although it has not (at this time) received a reply from Microsoft. Tom provided a repro, namely that this syntactically valid function definition:&lt;/p&gt;
&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[Function1]&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;()&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS TABLE&lt;br&gt;AS&lt;br&gt;RETURN &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH &lt;/span&gt;&lt;span style="color:black;"&gt;cte &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:black;"&gt;1 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[c1]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:black;"&gt;[$(Database3)].[dbo].[Table1]&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:black;"&gt;1 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[c1]&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:black;"&gt;cte&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;/code&gt;

&lt;p&gt;would produce this nasty unhelpful error upon deployment:&lt;br&gt;&lt;/p&gt;
&lt;font color="red"&gt;
&lt;p&gt;C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.TSqlTasks.targets(120,5): Error MSB4018: The "SqlDeployTask" task failed unexpectedly.&lt;br&gt;&lt;span style="font-weight:bold;"&gt;System.NullReferenceException: Object reference not set to an instance of an object&lt;/span&gt;.&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Sql.SchemaModel.SqlModelComparerBase.VariableSubstitution(SqlScriptProperty propertyValue, IDictionary`2 variables, Boolean&amp;amp; isChanged)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Sql.SchemaModel.SqlModelComparerBase.ArePropertiesEqual(IModelElement source, IModelElement target, ModelPropertyClass propertyClass, ModelComparerConfiguration configuration)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareProperties(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, ModelComparisonChangeDefinition changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithoutCompareName(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, ModelComparisonResult result, ModelComparisonChangeDefinition changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithSameType(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, ModelComparisonResult result, Boolean ignoreComparingName, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, Boolean compareFromRootElement, ModelComparisonChangeDefinition&amp;amp; changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareChildren(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, Boolean parentExplicitlyIncluded, Boolean compareParentElementOnly, ModelComparisonResult result, ModelComparisonChangeDefinition changes, Boolean isComposing)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithoutCompareName(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, ModelComparisonResult result, ModelComparisonChangeDefinition changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithSameType(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, ModelComparisonResult result, Boolean ignoreComparingName, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, Boolean compareFromRootElement, ModelComparisonChangeDefinition&amp;amp; changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareChildren(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, Boolean parentExplicitlyIncluded, Boolean compareParentElementOnly, ModelComparisonResult result, ModelComparisonChangeDefinition changes, Boolean isComposing)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithoutCompareName(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, ModelComparisonResult result, ModelComparisonChangeDefinition changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareElementsWithSameType(IModelElement sourceElement, IModelElement targetElement, ModelComparerConfiguration configuration, ModelComparisonResult result, Boolean ignoreComparingName, Boolean parentExplicitlyIncluded, Boolean compareElementOnly, Boolean compareFromRootElement, ModelComparisonChangeDefinition&amp;amp; changes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareAllElementsForOneType(ModelElementClass type, ModelComparerConfiguration configuration, ModelComparisonResult result, Boolean compareOrphanedElements)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.SchemaModel.ModelComparer.CompareStore(ModelStore source, ModelStore target, ModelComparerConfiguration configuration)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Build.SchemaDeployment.CompareModels()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Build.SchemaDeployment.PrepareBuildPlan()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Build.SchemaDeployment.Execute(Boolean executeDeployment)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Build.SchemaDeployment.Execute()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Data.Schema.Tasks.DBDeployTask.Execute()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean&amp;amp; taskResult)&lt;br&gt;&amp;nbsp;&amp;nbsp; Done executing task "SqlDeployTask" -- FAILED.&lt;br&gt;&amp;nbsp; Done building target "DspDeploy" in project "Lloyds.UKTax.DB.UKtax.dbproj" -- FAILED.&lt;br&gt;&amp;nbsp;Done executing task "CallTarget" -- FAILED.&lt;br&gt;Done building target "DBDeploy" in project &lt;br&gt;&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;It turns out there are a certain set of circumstances that need to be met for this error to occur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The object being deployed is an inline function&amp;nbsp; (may also exist for multistatement and scalar functions - I haven't tested that)&lt;br&gt;&lt;/li&gt;

&lt;li&gt;That object includes SQLCMD variable references&lt;/li&gt;

&lt;li&gt;The object has already been deployed successfully&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just to reiterate that last bullet point, the error does not occur when you deploy the function for the first time, only on the subsequent deployment.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Luckily I have a direct line into a guy on the development team so I fired off an email on Friday evening and today (Monday) I received a reply back telling me that there is a simple fix, one simply has to remove the parentheses that wrap the SQL statement. So, in the case of Tom's repro, the function definition simply needs to be changed to:&lt;/p&gt;
&lt;p&gt;
&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[Function1]&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;()&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS TABLE&lt;br&gt;AS&lt;br&gt;RETURN &lt;/span&gt;&lt;span style="color:green;"&gt;--(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH &lt;/span&gt;&lt;span style="color:black;"&gt;cte &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:black;"&gt;1 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[c1]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:black;"&gt;[$(Database3)].[dbo].[Table1]&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:black;"&gt;1 &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;&lt;span style="color:black;"&gt;[c1]&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:black;"&gt;cte&lt;br&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;--) &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;I have commented out the offending parentheses rather than removing them just to emphasize the point.
&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Thereafter the function will deploy fine. I tested this out on my own project this morning and can confirm that this fix does indeed work.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I have been told that the bug CAN be reproduced in the Release Candidate (RC) 0 build of SQL Server Data Tools in SQL Server 2012 so am hoping that a fix makes it in for the Release-To-Manufacturing (RTM) build.&lt;/p&gt;

&lt;p&gt;Hope this helps&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@jamiet&lt;/a&gt; &lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=39903" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamiet/~4/RyKm8ZMvQ7E" height="1" width="1"/&gt;</description><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Datadude/default.aspx">Datadude</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/juneau/default.aspx">juneau</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/DBPro/default.aspx">DBPro</category><category domain="http://sqlblog.com/blogs/jamie_thomson/archive/tags/SQL+Server+Data+Tools/default.aspx">SQL Server Data Tools</category><feedburner:origLink>http://sqlblog.com/blogs/jamie_thomson/archive/2011/11/21/workaround-for-datadude-deployment-bug.aspx</feedburner:origLink></item></channel></rss>

