<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-524597393242354846</id><updated>2012-01-11T07:15:45.269-05:00</updated><category term='Office 2007'/><category term='PASS Summit'/><category term='General'/><category term='SSIS'/><category term='SSAS'/><category term='Relational'/><category term='Excel'/><category term='Database Design'/><category term='SSRS'/><category term='SQL Server'/><title type='text'>Microsoft BI Musings</title><subtitle type='html'>Things I find of interest about the Microsoft BI stack (SQL Server, Office, SharePoint, and PerformancePoint).  This includes tips, tricks, rants, and raves.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-1844290840649668788</id><published>2009-07-16T21:01:00.001-04:00</published><updated>2009-07-16T21:03:39.916-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>Louisville SQL Server Users Group – SSIS (Part 2)</title><content type='html'>&lt;p&gt;This week, I continued the series of presentations on SSIS that I started for the Louisville SQL Server Users Group.&amp;#160; Here’s a copy of the second presentation in the series for anyone who attended (or missed it).&amp;#160; I extended the demonstration SSIS package that I started, but haven’t quite completed it yet, so I’ll post it in the near future.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 26px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-14d36ba7f9ad51da.skydrive.live.com/embedrow.aspx/Blog%20Files/Louisville%20SQL%20Server%20Users%20Group%20--%20SSIS%20Series/SSIS%20%7C5Part2%7C6.pptx" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately, I ran out of time to cover the last two topics in the presentation – Event Handlers and DTS Migration.&amp;#160; So, I’ll cover those first in the next session and continue on with as many of the other planned topics as we have time for.&lt;/p&gt;  &lt;p&gt;One last thought.&amp;#160; During the meeting, I mentioned &lt;a href="http://www.codeplex.com/bidshelper" target="_blank"&gt;BIDS Helper&lt;/a&gt;, a must have tool for anyone developing SSIS packages (or SSAS solutions or SSRS reports).&amp;#160; If you don’t have it, get it!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-1844290840649668788?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/1844290840649668788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=1844290840649668788' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/1844290840649668788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/1844290840649668788'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2009/07/louisville-sql-server-users-group-ssis_16.html' title='Louisville SQL Server Users Group – SSIS (Part 2)'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-578227537933179977</id><published>2009-07-16T20:35:00.002-04:00</published><updated>2009-07-16T20:58:47.339-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>Louisville SQL Server Users Group – SSIS (Part 1)</title><content type='html'>&lt;p&gt;Back in April, I started a series of presentations on SSIS for the Louisville SQL Server Users Group.&amp;#160; Here’s a copy of the presentation for anyone who attended (or not).&amp;#160; I started building a demonstration SSIS package as part of the presentation and will post it along with one of the next few sessions in the series.&lt;/p&gt;  &lt;p&gt;&lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 26px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-14d36ba7f9ad51da.skydrive.live.com/embedrow.aspx/Blog%20Files/Louisville%20SQL%20Server%20Users%20Group%20--%20SSIS%20Series/SSIS%20%7C5Part%201%7C6.pptx" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-578227537933179977?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/578227537933179977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=578227537933179977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/578227537933179977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/578227537933179977'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2009/07/louisville-sql-server-users-group-ssis.html' title='Louisville SQL Server Users Group – SSIS (Part 1)'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-1478611625338692735</id><published>2008-11-28T21:54:00.001-05:00</published><updated>2008-11-28T21:54:46.432-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Summit'/><title type='text'>Optimizing Dimension Designs (Series Prelude)</title><content type='html'>&lt;p&gt;As I indicated in my &lt;a href="http://davefackler.blogspot.com/2008/11/pass-summit-2008-session-on.html"&gt;last post&lt;/a&gt;, I presented at the PASS Summit 2008 conference on optimizing dimension designs.&amp;#160; This is a prelude to a series of posts I'll be doing over the next several weeks related to that presentation.&lt;/p&gt;  &lt;p&gt;First things first.&amp;#160; If you missed my session, you missed a special appearance by Beaker from &lt;a href="http://en.wikipedia.org/wiki/The_Muppets" target="_blank"&gt;The Muppets&lt;/a&gt;.&amp;#160; As I mentioned during my talk, I used to work at &lt;a href="http://www.intellinet.com" target="_blank"&gt;Intellinet&lt;/a&gt;, a great consulting firm located in Atlanta.&amp;#160; While there (from 1997 to 2005), I grew and managed the original BI practice there, trying to manage the likes of &lt;a href="http://www.solidq.com/na/MentorDetail.aspx?Id=22" target="_blank"&gt;Douglas McDowell&lt;/a&gt; and &lt;a href="http://www.solidq.com/na/MentorDetail.aspx?Id=12" target="_blank"&gt;Erik Veerman&lt;/a&gt; (yes, I'm partially responsible for both of them!)&amp;#160; At any rate, at a Christmas party one year, they presented me with a special award -- my very own Beaker statue.&amp;#160; I certainly don't see the resemblance, but everyone got a kick out of it (and I still have that statue!)&amp;#160; So, to lighten up my session, I started things off right by including this &lt;a href="http://www.youtube.com/watch?v=lTC2Ihnsrf0" target="_blank"&gt;Beaker video&lt;/a&gt; -- and explained to everyone that I was a lot like Beaker in that video during the conference as I had to completely rebuild my VPC and demos after an external USB drive crashed on me the day before the conference started -- yikes!&lt;/p&gt;  &lt;p&gt;At any rate, enjoy the Beaker video if you didn't catch my session.&amp;#160; And if you managed to catch my session, let me know if you thought Beaker stole the show!!&lt;/p&gt;  &lt;p&gt;PS.&amp;#160; Congratulations to Douglas McDowell for becoming a &lt;a href="http://www.sqlpass.org/Portals/0/Press%20Releases/PASS%20Announces%20New%20Board%20Members_112108Final.pdf" target="_blank"&gt;new PASS Board member&lt;/a&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-1478611625338692735?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/1478611625338692735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=1478611625338692735' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/1478611625338692735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/1478611625338692735'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/11/optimizing-dimension-designs-series.html' title='Optimizing Dimension Designs (Series Prelude)'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-3363126460313551575</id><published>2008-11-21T22:12:00.001-05:00</published><updated>2008-11-21T22:27:31.201-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Summit'/><title type='text'>PASS Summit 2008 Session on Optimizing Dimension Designs</title><content type='html'>&lt;p&gt;Well, its been quite some time since I last blogged.&amp;#160; The summer and fall were a pretty busy time, but I guess everyone is busy, so that's no real excuse.&amp;#160; Although I didn't post about it prior to the PASS Summit 2008 conference, I finished up my &lt;a href="http://www.softconference.com/pass/ProgramSessions/program-sessiondetail.asp?SID=130884"&gt;presentation&lt;/a&gt; at the conference today.&amp;#160; As in prior years, I spoke about dimension designs in SSAS.&amp;#160; This year I included information regarding good dimension designs and a few interesting design scenarios that call for &amp;quot;outside the box&amp;quot; thinking.&lt;/p&gt;  &lt;p&gt;Over the next several weeks, I'm planning a series of posts containing information from my presentation.&amp;#160; And I'll hopefully include some details that I had to gloss over based on the limited amount of time available during my session (75 minutes goes by pretty quickly!)&amp;#160; If you happened to catch my session, let me know what you thought -- hopefully it was entertaining if nothing else!&amp;#160; And stay tuned over the coming weeks for additional posts related to optimizing dimension designs.&lt;/p&gt;  &lt;p&gt;PS.&amp;#160; If I get permission from PASS, I'll post my slide deck here (waiting to hear if that breaks any speaker rules or not...)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-3363126460313551575?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/3363126460313551575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=3363126460313551575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/3363126460313551575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/3363126460313551575'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/11/pass-summit-2008-session-on.html' title='PASS Summit 2008 Session on Optimizing Dimension Designs'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-5908447276502164451</id><published>2008-06-25T12:24:00.001-04:00</published><updated>2008-06-25T12:24:12.111-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><title type='text'>Handling Multiple Calendars with a M2M Scenario (Part 2)</title><content type='html'>&lt;p&gt;In my &lt;a href="http://davefackler.blogspot.com/2008/05/handling-multiple-calendars-with-m2m.html"&gt;last post&lt;/a&gt;, I started describing a way to handle multiple calendars using a many-to-many scenario.&amp;#160; As I explained, a recent client engagement called for a solution that would allow them to add calendars (customer calendars in particular) without requiring changes to the relational or SSAS models.&amp;#160; In most classic date dimensions, multiple calendars are handled using additional columns for the additional calendar parts that each date has.&amp;#160; These additional columns are then added to SSAS as additional attributes in the date dimension; these attributes are then typically used to create specific user hierarchies for that particular calendar (a Gregorian calendar hierarchy, a fiscal calendar hierarchy, etc.)&lt;/p&gt;  &lt;p&gt;The previous post laid the groundwork for creating a multi-calendar solution using a many-to-many scenario.&amp;#160; In that post, I described a new DimCalendar dimension table that would contain a row for each date within each of the calendars needed.&amp;#160; The table contained date-part columns (for things like year, quarter, month, etc.), but these were not specific to a given calendar.&amp;#160; Instead, they contained the appropriate date-parts for a given date within a given calendar.&amp;#160; One thing to note about this approach is that the DimCalendar dimension table will hold N times the number of dates that you might need for all the years you need to represent in your solution.&amp;#160; Thus, if you need 10 years worth of dates, a standard date dimension might contain approximately 3,650 rows; with the DimCalendar table, if you need 4 calendars represented for those same 10 years, the table will contain approximately 14,600 rows.&amp;#160; Given this is a relatively low row count for a dimension table, this shouldn't impose any performance problems with the solution.&lt;/p&gt;  &lt;p&gt;With the DimCalendar table available, we can create a new [Calendar] dimension within SSAS using standard dimension techniques.&amp;#160; Using the DimCalendar table design from the last post, the [Calendar] dimension within SSAS might look like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/davefacklerblog/SGJwuU6qI4I/AAAAAAAAAQ4/3K_5d2y71Pg/s1600-h/CalendarDimensionDesign3.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="339" alt="Calendar Dimension Design" src="http://lh6.ggpht.com/davefacklerblog/SGJwxyMwgQI/AAAAAAAAAQ8/Cok8i-uKKQ8/CalendarDimensionDesign_thumb.jpg?imgmax=800" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A few notes about the design:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The [Calendar] attribute contains the calendar names based on the values found in the CalendarName column from the DimCalendar table; the DefaultMember property of the [Calendar] attribute is set to [Calendar].[Calendar].&amp;amp;[Gregorian] so that the default calendar is the Gregorian calendar; this attribute also has its IsAggregatable property set to False. &lt;/li&gt;    &lt;li&gt;The other attributes are built in a typical fashion, using standard KeyColumns and NameColumn values based on columns available from the DimCalendar table; in addition, standard attribute relationships exist between attributes as would be expected in a date dimension (with the additional step of relating the [Year] attribute to [Calendar]). &lt;/li&gt;    &lt;li&gt;The [Year-Quarter-Month] and [Year-Week] hierarchies are built in a typical fashion. &lt;/li&gt;    &lt;li&gt;The [Date Calculations] attribute is based on a named calculation column in the DSV (a standard approach for &amp;quot;hanging&amp;quot; date calculations on an attribute within a date dimension) with a default value of &amp;quot;Current Calendar Date&amp;quot;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;With the new [Calendar] dimension in place, we can update the cube to take advantage of it.&amp;#160; Note that in the discussion that follows, I did not remove the existing [Date] dimension from the Adventure Works cube.&amp;#160; Ideally, however, the new [Calendar] dimension would replace it (and could be used in a role-playing fashion just like the [Date] dimension is used already).&lt;/p&gt;  &lt;p&gt;The first step to updating the cube is to add a new measure group based on the new FactDateCalendar table.&amp;#160; Remember that this table contains the linkage between the existing DimTime table (which is related to all the other fact tables) and the new DimCalendar table.&amp;#160; The measure group need only contain a single, hidden measure that uses the Count aggregate function to aggregate the row count of the FactDateCalendar table based on its related dimensions.&amp;#160; In the screen shot below, note the diagram showing the relationships between the new tables and the new measure group named &amp;quot;Fact Date Calendar&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/davefacklerblog/SGJw1qRGVrI/AAAAAAAAARA/tvtzETQXnaE/s1600-h/NewMeasureGroup4.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="274" alt="New Measure Group" src="http://lh4.ggpht.com/davefacklerblog/SGJw7kov5BI/AAAAAAAAARE/yjSLqGOqytw/NewMeasureGroup_thumb1.jpg?imgmax=800" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;With the new measure group in place, the Dimension Usage tab can be used to relate the [Calendar] and [Date] dimensions to it and create the many-to-many relationship between the new [Calendar] dimension and the other related measure groups.&amp;#160; The following shows the a few of the relationships defined on the Dimension Usage tab.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/davefacklerblog/SGJw-12SX1I/AAAAAAAAARI/oeNjBAt2V4Q/s1600-h/NewManytoManyRelationships4.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="355" alt="New Many-to-Many Relationships" src="http://lh3.ggpht.com/davefacklerblog/SGJxAuY6X1I/AAAAAAAAARM/Bbgc-wUcAnc/NewManytoManyRelationships_thumb1.jpg?imgmax=800" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that the many-to-many relationships use the new &amp;quot;Fact Date Calendar&amp;quot; measure group as the intermediate measure group.&amp;#160; Also note that many-to-many relationships exist between the [Calendar] dimension and the other measure groups (I just chose not to show them all in the screen shot). &lt;/p&gt;  &lt;p&gt;With the new measure group in place along with the new relationships, the solution can be deployed, processed, and then queried (using the BIDS browser, the SSMS browser, or a front-end tool like Excel).&amp;#160; The following shows a simple Excel 2007 pivot-table that uses the [Year-Quarter-Month] hierarchy from the new [Calendar] dimension along with measures from the &amp;quot;Internet Sales&amp;quot; measure group.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/davefacklerblog/SGJxCX6rr2I/AAAAAAAAARQ/1Hy6a03-Ndo/s1600-h/SimplePivotTablewithCalendarDimensio%5B2%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="283" alt="Simple Pivot-Table with Calendar Dimension" src="http://lh6.ggpht.com/davefacklerblog/SGJxE9E4roI/AAAAAAAAARU/dv-Xnwwi4ds/SimplePivotTablewithCalendarDimensio%5B1%5D.jpg?imgmax=800" width="426" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note the different calendars showing the same grand total, but with different subtotals below that based on the fact that days aggregate to fiscal years differently than they do for calendar years (at least for Adventure Works).&amp;#160; If users want to focus on a particular calendar, they can filter the hierarchy or include the [Calendar] attribute as a page-level filter to get the same affect.&amp;#160; Also note that if a query doesn't include the new [Calendar] hierarchy, everything works as expected given the fact that the Gregorian calendar is set as the default calendar and aggregates and totals work as expected.&lt;/p&gt;  &lt;p&gt;Finally, to round out the solution, we can add date calculations to the new [Calendar] dimension and make them work as expected.&amp;#160; Earlier, I mentioned that the [Date Calculations] attribute was added to the new [Calendar] dimension in order to provide a place to &amp;quot;hang&amp;quot; date calculations.&amp;#160; This is a fairly standard approach that has been described (with its various pros and cons discussed) by many different SSAS practitioners over the last several years; thus, I won't go into a lot of discussion about the approach here.&amp;#160; Suffice it to say, the following provides the MDX I added to the calculations script for the cube in order to create three example date calculations (which apply to different sets of calendars -- for example purposes only).&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; height: 318px; background-color: #f4f4f4"&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;// Date calculations for the [Calendar] dimension&lt;br /&gt;&lt;br /&gt;Create Member CurrentCube.[Calendar].[Date Calculations].[Year to Date]&lt;br /&gt;As Null;&lt;br /&gt;&lt;br /&gt;Create Member CurrentCube.[Calendar].[Date Calculations].[Year Over Year Growth %]&lt;br /&gt;As Null;&lt;br /&gt;&lt;br /&gt;Create Member CurrentCube.[Calendar].[Date Calculations].[Year Over Year Growth]&lt;br /&gt;As Null;&lt;br /&gt;&lt;br /&gt;Create Set [Date Calculation Target Measures]&lt;br /&gt;As&lt;br /&gt;    {&lt;br /&gt;    [Measures].[Internet Sales Amount]&lt;br /&gt;    ,[Measures].[Internet Order Quantity]&lt;br /&gt;    ,[Measures].[Internet Order Count]&lt;br /&gt;    ,[Measures].[Reseller Sales Amount]&lt;br /&gt;    ,[Measures].[Reseller Order Quantity]&lt;br /&gt;    ,[Measures].[Reseller Order Count]&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;// [Year to Date]&lt;br /&gt;Scope&lt;br /&gt;    (&lt;br /&gt;    [Date Calculation Target Measures]&lt;br /&gt;    ,[Calendar].[Date Calculations].[Year to Date]&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// [Year-Quarter-Month].[Year] level&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year-Quarter-Month].[Year].Members&lt;br /&gt;) =&lt;br /&gt;    Aggregate&lt;br /&gt;        (&lt;br /&gt;        {[Calendar].[Date Calculations].DefaultMember} *&lt;br /&gt;        PeriodsToDate&lt;br /&gt;            (&lt;br /&gt;            [Calendar].[Year-Quarter-Month].[Year]&lt;br /&gt;            ,[Calendar].[Year-Quarter-Month].CurrentMember&lt;br /&gt;            )&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;// [Year-Quarter-Month].[Quarter] level&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year-Quarter-Month].[Quarter].Members&lt;br /&gt;) =&lt;br /&gt;    Aggregate&lt;br /&gt;        (&lt;br /&gt;        {[Calendar].[Date Calculations].DefaultMember} *&lt;br /&gt;        PeriodsToDate&lt;br /&gt;            (&lt;br /&gt;            [Calendar].[Year-Quarter-Month].[Year]&lt;br /&gt;            ,[Calendar].[Year-Quarter-Month].CurrentMember&lt;br /&gt;            )&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;// [Year-Quarter-Month].[Month] level&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year-Quarter-Month].[Month].Members&lt;br /&gt;) =&lt;br /&gt;    Aggregate&lt;br /&gt;        (&lt;br /&gt;        {[Calendar].[Date Calculations].DefaultMember} *&lt;br /&gt;        PeriodsToDate&lt;br /&gt;            (&lt;br /&gt;            [Calendar].[Year-Quarter-Month].[Year]&lt;br /&gt;            ,[Calendar].[Year-Quarter-Month].CurrentMember&lt;br /&gt;            )&lt;br /&gt;        );&lt;br /&gt;  &lt;br /&gt;// [Year-Week].[Year] level&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year-Week].[Year].Members&lt;br /&gt;) =&lt;br /&gt;    Aggregate&lt;br /&gt;        (&lt;br /&gt;        {[Calendar].[Date Calculations].DefaultMember} *&lt;br /&gt;        PeriodsToDate&lt;br /&gt;            (&lt;br /&gt;            [Calendar].[Year-Week].[Year]&lt;br /&gt;            ,[Calendar].[Year-Week].CurrentMember&lt;br /&gt;            )&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;// [Year-Week].[Week] level&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year-Week].[Week].Members&lt;br /&gt;) =&lt;br /&gt;    Aggregate&lt;br /&gt;        (&lt;br /&gt;        {[Calendar].[Date Calculations].DefaultMember} *&lt;br /&gt;        PeriodsToDate&lt;br /&gt;            (&lt;br /&gt;            [Calendar].[Year-Week].[Year]&lt;br /&gt;            ,[Calendar].[Year-Week].CurrentMember&lt;br /&gt;            )&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;End Scope;&lt;br /&gt;&lt;br /&gt;// [Year Over Year Growth %]&lt;br /&gt;// Applied only to the [Gregorian] calendar&lt;br /&gt;Scope&lt;br /&gt;    (&lt;br /&gt;    [Date Calculation Target Measures]&lt;br /&gt;    ,[Calendar].[Date Calculations].[Year Over Year Growth %]&lt;br /&gt;    ,[Calendar].[Calendar].[Gregorian]&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// [Year] attribute&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year].[Year].Members ( 1 ) : Null&lt;br /&gt;) =&lt;br /&gt;    IIf&lt;br /&gt;        (&lt;br /&gt;            ([Calendar].[Date Calculations].DefaultMember, [Calendar].[Year].CurrentMember.Lag(1)) = 0&lt;br /&gt;            ,Null&lt;br /&gt;            ,&lt;br /&gt;                (&lt;br /&gt;                ([Calendar].[Date Calculations].DefaultMember) -&lt;br /&gt;                ([Calendar].[Date Calculations].DefaultMember, [Calendar].[Year].CurrentMember.Lag(1))&lt;br /&gt;                )&lt;br /&gt;                /&lt;br /&gt;                ([Calendar].[Date Calculations].DefaultMember, [Calendar].[Year].CurrentMember.Lag(1))&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;Format_String&lt;br /&gt;    (&lt;br /&gt;    ([Calendar].[Date Calculations].[Year Over Year Growth %])&lt;br /&gt;    ) = &amp;quot;Percent&amp;quot;;&lt;br /&gt;&lt;br /&gt;End Scope;&lt;br /&gt;  &lt;br /&gt;// [Year Over Year Growth]&lt;br /&gt;// Applied only to the [Fiscal] calendar&lt;br /&gt;Scope&lt;br /&gt;    (&lt;br /&gt;    [Date Calculation Target Measures]&lt;br /&gt;    ,[Calendar].[Date Calculations].[Year Over Year Growth]&lt;br /&gt;    ,[Calendar].[Calendar].[Fiscal]&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// [Year] attribute&lt;br /&gt;(&lt;br /&gt;[Calendar].[Year].[Year].Members ( 1 ) : Null&lt;br /&gt;) =&lt;br /&gt;    ([Calendar].[Date Calculations].DefaultMember) -&lt;br /&gt;    ([Calendar].[Date Calculations].DefaultMember, [Calendar].[Year].CurrentMember.Lag(1));&lt;br /&gt;  &lt;br /&gt;End Scope ;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With this script in place, the Excel 200 pivot table shown above can be updated to include the new date calculations (showing just one of the measure included in the set of measures the date calculations apply to).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/davefacklerblog/SGJxHZ9HkBI/AAAAAAAAARY/Ax6r1myHLHs/s1600-h/ExcelPivotTablewithCalendarDimandDat%5B3%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="317" alt="Excel Pivot-Table with Calendar Dim and Date Calculations" src="http://lh5.ggpht.com/davefacklerblog/SGJxJsUIXwI/AAAAAAAAARc/DYukF2PZfz4/ExcelPivotTablewithCalendarDimandDat.jpg?imgmax=800" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Note that in the screen shot below, a &amp;quot;Reporting&amp;quot; calendar shows up along with the &amp;quot;Fiscal&amp;quot; and &amp;quot;Gregorian&amp;quot; calendars.&amp;#160; The nice thing about this solution is that I didn't have to change the design at all in order to add this new calendar (that's the whole point of the design).&amp;#160; In fact, I had completed the design work described above, deployed and processed the solution, and was browsing it with just the &amp;quot;Fiscal&amp;quot; and &amp;quot;Gregorian&amp;quot; calendars included.&amp;#160; I then used a T-SQL script to add the new &amp;quot;Reporting&amp;quot; calendar by adding rows to the new DimCalendar and FactDateCalendar tables in the relational database.&amp;#160; I then reprocessed the [Calendar] dimension and the &amp;quot;Fact Date Calendar&amp;quot; measure group (without reprocessing any other dimensions or measure groups in the solution) and viola!&amp;#160; The new &amp;quot;Reporting&amp;quot; calendar was established and showed up in my pivot-table.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hopefully, others out there who may be faced with supporting multiple calendars (beyond the standard &amp;quot;Fiscal&amp;quot; and &amp;quot;Gregorian&amp;quot; varieties) will find this approach interesting and useful.&amp;#160; Let me know what you think...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;PS.&amp;#160; If you want to download a copy of the solution, I've made it available as a zip file here:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-14d36ba7f9ad51da.skydrive.live.com/embedrowdetail.aspx/Blog%20Files/Adventure%20Works%20DW%20-%20M2M%20Calendar.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The SQL database should be restored as &amp;quot;AdventureWorksDW-M2MCalendar&amp;quot; and the SSAS solution should be deployed as &amp;quot;Adventure Works DW - M2M Calendar&amp;quot;.&amp;#160; I typically create copies of the base Adventure Works sample databases for creating and testing new ideas and solutions.&amp;#160; Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-5908447276502164451?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/5908447276502164451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=5908447276502164451' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/5908447276502164451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/5908447276502164451'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/06/handling-multiple-calendars-with-m2m.html' title='Handling Multiple Calendars with a M2M Scenario (Part 2)'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/davefacklerblog/SGJwxyMwgQI/AAAAAAAAAQ8/Cok8i-uKKQ8/s72-c/CalendarDimensionDesign_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-3294405785456081940</id><published>2008-05-10T14:34:00.001-04:00</published><updated>2008-05-10T14:34:28.955-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><title type='text'>Handling Multiple Calendars with a M2M Scenario</title><content type='html'>&lt;p&gt;Most dimensional models and BI solutions implement a date dimension of one type or another and many of them include multiple calendars -- the &amp;quot;wall&amp;quot; (or Gregorian) calendar, a fiscal calendar, a manufacturing calendar, etc.&amp;#160; Handling multiple calendars is fairly simple and most people approach the problem by adding additional columns to a date dimension table that holds a row for each date they need.&amp;#160; Thus, many date dimension tables look like the one in Adventure Works:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="412" alt="DimTime Dimension Table" src="http://lh3.ggpht.com/davefacklerblog/SCXqof9orvI/AAAAAAAAAP4/Iki5s5pJEEM/DimTime%20Dimension%20Table%5B4%5D%5B8%5D.jpg?imgmax=800" width="196" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;However, what if you need to support more calendars now (maybe more than 3 or 4) and you need a solution that will support N calendars into the future?&amp;#160; Sounds a little crazy, but a while back I was working with a client that had such a need.&amp;#160; As it turned out, they wanted to have their major customer fiscal calendars included in their date dimension so that sales and marketing managers could analyze data according to the fiscal calendar of the customer.&amp;#160; Maybe not so crazy...&lt;/p&gt;  &lt;p&gt;The client wanted a solution that would not require schema changes (relationally or in SSAS) whenever a new calendar needed to be added (or when a calendar needed to be retired).&amp;#160; Thus, the solution couldn't really rely on things like adding new columns to a date dimension.&amp;#160; After thinking about the problem quite a bit, we decided that we could solve it using a M2M scenario.&amp;#160; In this blog entry, I'll lay the ground work for the solution by providing the details on the relational side.&amp;#160; In a follow-on entry, I'll finish it up by showing the details on the SSAS side.&lt;/p&gt;  &lt;p&gt;On the relational side, we needed to add a table to hold the calendar information as well as a &amp;quot;bridge&amp;quot; table that would relate dates to a given calendar.&amp;#160; I'll show how this might work in the AdventureWorksDW database.&amp;#160; To begin with, we'll continue to use the DimTime table as it exists today so that we can compare our new solution and its results to the existing mechanism for showing the Gregorian and fiscal calendars for Adventure Works.&amp;#160; A &amp;quot;final&amp;quot; version of this solution might trim down the DimTime table so that it only includes TimeKey and FullDateAlternateKey.&lt;/p&gt;  &lt;p&gt;Now, we need a new dimension table to represent our new solution for calendars and dates.&amp;#160; Each row in the new table will represent a date within a given calendar; thus, we will end up with 1/1/2008 in the table for as many calendars as we need to support.&amp;#160; And every new calendar that gets added (in the future) will add a new row for 1/1/2008.&amp;#160; Thus, the grain of the dimension table is no longer just the date -- it's the combination of a date and the calendar it belongs to.&amp;#160; Thus, we create a new DimCalendar table that looks something like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="311" alt="DimCalendar Dimension Table" src="http://lh5.ggpht.com/davefacklerblog/SCXqo_9orwI/AAAAAAAAAQA/kdvfjhcRaT0/DimCalendar%20Dimension%20Table%5B5%5D.jpg?imgmax=800" width="196" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Notice that the table includes most of the normal attributes you'd think of for a date -- year attributes, quarter attributes, etc.&amp;#160; If a given calendar needs more attributes (for different &amp;quot;levels&amp;quot;), you can add columns for them (semesters, for example).&amp;#160; If a given calendar doesn't need that particular &amp;quot;level&amp;quot; or attribute, then you can simply leave that column NULL for each of the dates in that calendar.&lt;/p&gt;  &lt;p&gt;You may be wondering why the table design includes the date itself (DayName and DayNumber attributes) since we're going to end up relating this new table to the existing DimTime table, which already includes date.&amp;#160; By including date here, we're able to include the day level in hierarchies that we build based on this new dimension (for example, Year-Quarter-Month-Day and Year-Week-Day hierarchies).&lt;/p&gt;  &lt;p&gt;When populating this table, we decided to ensure that the DayNumber column provided a unique value for each day within each calendar.&amp;#160; Thus, for each row, we decided to assign a prefix (10 for the Gregorian calendar, 20 for the first fiscal calendar, etc.) to each day number.&amp;#160; So, the DayNumber column for 1/1/2008 in the Gregorian calendar became 1020080101 while the DayNumber column for 1/1/2008 in the first fiscal calendar became 2020080101.&lt;/p&gt;  &lt;p&gt;With this table in hand, you can populate each calendar that you need by simply adding rows to the table for each day (across as many years as you want) for each calendar.&amp;#160; And in the future, you can add another calendar by simply adding new rows to the table for each day in the new calendar.&amp;#160; New calendars no longer need schema changes.&amp;#160; Here's what some of the data in the DimCalendar table might look like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/davefacklerblog/SCXqpf9orxI/AAAAAAAAAQI/_6XrAhMGo6A/s1600-h/DimCalendar%20Table%20Data%5B11%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="239" alt="DimCalendar Table Data" src="http://lh6.ggpht.com/davefacklerblog/SCXqqP9oryI/AAAAAAAAAQQ/0qXReqTta_w/DimCalendar%20Table%20Data_thumb%5B8%5D.jpg?imgmax=800" width="470" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finally, to make the M2M scenario work for us, we need a bridge table that relates DimTime to DimCalendar.&amp;#160; This new bridge table will relate a date from DimTime (like 1/1/2008) to multiple rows in the DimCalendar table (like our 1/1/2008 row for the Gregorian calendar and our 1/1/2008 row in the first fiscal calendar.&amp;#160; We named this new bridge table FactDateCalendar and it looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/davefacklerblog/SCXqqf9orzI/AAAAAAAAAQY/Fjt-Hazd97w/s1600-h/FactDateCalendar%20Bridge%20Table%5B4%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="93" alt="FactDateCalendar Bridge Table" src="http://lh4.ggpht.com/davefacklerblog/SCXqrv9or0I/AAAAAAAAAQg/shmTlp8kA-o/FactDateCalendar%20Bridge%20Table_thumb%5B1%5D.jpg?imgmax=800" width="196" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The overall model of using these new tables (shown along with a couple of the existing fact tables in the AdventureWorksDW database) then looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/davefacklerblog/SCXqsP9or1I/AAAAAAAAAQo/X9LkHlwbVr4/s1600-h/Updated%20AdventureWorksDW%20Model%5B10%5D.jpg"&gt;&lt;img height="282" alt="Updated AdventureWorksDW Model" src="http://lh3.ggpht.com/davefacklerblog/SCXqsf9or2I/AAAAAAAAAQw/bGo-6ZUqNk4/Updated%20AdventureWorksDW%20Model_thumb%5B7%5D.jpg?imgmax=800" width="454" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;With these tables populated (using whatever means necessary), we're ready to modify the SSAS solution for Adventure Works to use our new M2M scenario.&amp;#160; I'll follow-up in the next week or so with those details.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-3294405785456081940?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/3294405785456081940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=3294405785456081940' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/3294405785456081940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/3294405785456081940'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/05/handling-multiple-calendars-with-m2m.html' title='Handling Multiple Calendars with a M2M Scenario'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/davefacklerblog/SCXqof9orvI/AAAAAAAAAP4/Iki5s5pJEEM/s72-c/DimTime%20Dimension%20Table%5B4%5D%5B8%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-4911501571981736052</id><published>2008-04-13T14:39:00.001-04:00</published><updated>2008-04-13T14:39:34.940-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='SSRS'/><title type='text'>Intelligencia Query for BIDS and SSRS</title><content type='html'>&lt;p&gt;Very interesting announcement from Chris Webb (working with Andrew Wiles) about a new tool to ease the pain of using SSRS to create SSAS reports:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1797.entry" href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1797.entry"&gt;http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1797.entry&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I definitely plan to try this out.&amp;#160; I, like Chris, have had to manage client expectations on many different projects when the client wanted to use SSRS to create reports based on SSAS solutions.&amp;#160; If this works half as well as I suspect it will (with Chris and Andrew behind it), I'll likely be ready to actually start recommending SSRS and SSAS together!&lt;/p&gt;  &lt;p&gt;Exciting stuff!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-4911501571981736052?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/4911501571981736052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=4911501571981736052' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/4911501571981736052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/4911501571981736052'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/04/intelligencia-query-for-bids-and-ssrs.html' title='Intelligencia Query for BIDS and SSRS'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-2025898301647741682</id><published>2008-03-12T16:47:00.001-04:00</published><updated>2008-03-12T16:57:55.868-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='Office 2007'/><title type='text'>Dimension Security Issues with Excel 2007 and SSAS 2005 Parent-Child Hierarchies</title><content type='html'>&lt;p&gt;I've seen and read a lot of different posts and blog entries related to Excel 2007 and SSAS 2005 issues. Mostly things that don't work as planned with regards to displaying and using calculated members, incorrect query results given Excel's subcube-based filtering and its interaction with default members, etc. But here's one that I don't think I've run across yet that actually causes an error to occur while browsing a cube...&lt;/p&gt;&lt;p&gt;Suppose you have dimension security set up on a parent-child dimension. This is a common scenario in a sales cube or any other cube that contains a parent-child dimension related to people within an organization. In most cases, individuals should be restricted to just seeing themselves plus their subordinates within the parent-child hierarchy. Typically, I've seen this done by including AD logins as an attribute in the dimension and then using an MDX expression to restrict the allowed set of members within the parent-child hierarchy to just the user currently logged in (which then includes their subordinates by default in a parent-child hierarchy).&lt;/p&gt;&lt;p&gt;Here's a quick example using Adventure Works. I've created a new role in the Adventure Works SSAS solution named "Employees Security.role". This role specifies dimension data security based on the [Employee] dimension within the [Adventure Works] cube. Security is enabled on the [Employees] attribute within the dimension using the following MDX expression for the Allowed Member Set property:&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;Filter(&lt;br /&gt;    [Employee].[Employees].Members,&lt;br /&gt;    [Employee].[Employees].CurrentMember.Properties(&lt;span style="color: #006080"&gt;&amp;quot;Login ID&amp;quot;&lt;/span&gt;) = &lt;span style="color: #006080"&gt;&amp;quot;adventure-works\amy0&amp;quot;&lt;/span&gt;&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Note that in this example, I'm referring directly to the AD login for the employee named Amy E. Alberts; normally, the MDX expression would use the UserName function to return the AD login of the current user. Doing it this way allows me to easily test the security role. Also note that I have Visual Totals enabled for the security role. Here's what the security role looks like:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R9hBN14c37I/AAAAAAAAAN4/wma0skXzcp4/Dimension%20Security%20Settings%20for%20Employees%20Security%20Role%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="240" alt="Dimension Security Settings for Employees Security Role" src="http://lh6.google.com/davefacklerblog/R9hBOV4c38I/AAAAAAAAAOA/QdYqT7fF29s/Dimension%20Security%20Settings%20for%20Employees%20Security%20Role_thumb%5B1%5D" width="217" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;With this in place, I can browse the [Adventure Works] cube. When I browse the cube without using the security role, I can see all of the employees in the [Employees] parent-child dimension as shown below:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R9hBO14c39I/AAAAAAAAAOI/ay4a2INc6x4/All%20Employees%20Visible%20with%20No%20Security%20Role%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="134" alt="All Employees Visible with No Security Role" src="http://lh5.google.com/davefacklerblog/R9hBPF4c3-I/AAAAAAAAAOQ/5mI3GiFSG5k/All%20Employees%20Visible%20with%20No%20Security%20Role_thumb%5B1%5D" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;However, when I connect to the cube through the security role (using the Change User button on the browser toolbar in either the BIDS cube designer or in the SSMS cube browser window), I'm relegated to seeing just Amy (along with her superiors -- required so that I can drill down to Amy) and her subordinates as shown below:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R9hBPl4c3_I/AAAAAAAAAOY/-BuGKxvzXW8/Secured%20Employess%20with%20Security%20Role%5B7%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="68" alt="Only Secured Employees Visible with Security Role" src="http://lh5.google.com/davefacklerblog/R9hBQF4c4AI/AAAAAAAAAOg/sBkC3Qj1usw/Secured%20Employess%20with%20Security%20Role_thumb%5B2%5D" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Works great. Notice that Visual Totals has kicked in with the role so that I cannot see any numbers beyond those of Amy. This even works well within Excel 2003. If I connect and create a pivot table using the standard features in Excel 2003, I can see all of the employees when not connected through the security role:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R9hBQl4c4BI/AAAAAAAAAOo/zbIlRlUKWA4/Excel%202003%20PivotTable%20with%20No%20Dimension%20Security%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="146" alt="Excel 2003 PivotTable with No Dimension Security" src="http://lh4.google.com/davefacklerblog/R9hBQ14c4CI/AAAAAAAAAOw/2eOM5Qt36RI/Excel%202003%20PivotTable%20with%20No%20Dimension%20Security_thumb%5B1%5D" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;If I update the .oqy file created by Microsoft Query within Excel 2007, I can add "Roles=Employees Security" to the end of the connection string to get Excel 2003 to connect through the security role. After doing this, when I create the same pivot table as seen above, dimension security kicks in as I would expect it to:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R9hBRV4c4DI/AAAAAAAAAO4/rjYO63cR_Lg/Excel%202003%20PivotTable%20with%20Dimension%20Security%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="79" alt="Excel 2003 PivotTable with Dimension Security" src="http://lh3.google.com/davefacklerblog/R9hBRl4c4EI/AAAAAAAAAPA/Myj2VMVnY4k/Excel%202003%20PivotTable%20with%20Dimension%20Security_thumb%5B1%5D" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Notice that Visual Totals is working correctly and I'm limited to seeing Amy and her subordinates (and her superiors again in order to provide a drill-down path to get to her). Fabulous!&lt;/p&gt;&lt;p&gt;However, when I try this same thing using Excel 2007, it just doesn't work. First, I'll create an Excel 2007 pivot table without any dimension security in place. This works fine using the parent-child hierarchy:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.google.com/davefacklerblog/R9hBSF4c4FI/AAAAAAAAAPI/sWfYQQpYUko/Excel%202007%20PivotTable%20with%20No%20Dimension%20Security%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="240" alt="Excel 2007 PivotTable with No Dimension Security" src="http://lh6.google.com/davefacklerblog/R9hBSV4c4GI/AAAAAAAAAPQ/9LEveZcBOz8/Excel%202007%20PivotTable%20with%20No%20Dimension%20Security_thumb%5B1%5D" width="217" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Okay so far. Now, if I update the connection used by the pivot table (highlight the Data option on the Excel ribbon, click on the Properties toolbar button in the Connections group, then add "Roles=Employees Security" to the end of the Connection String on the Definition tab of the Connection Properties dialog box), I can attempt to recreate the pivot table. When I add the [Employees] parent-child hierarchy along with the [Reseller Sales Amount] measure (as done above), things look promising (and you can see that Visual Totals has kicked in):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R9hBS14c4HI/AAAAAAAAAPY/4VGnf2X3Upw/Excel%202007%20PivotTable%20with%20Dimension%20Security%5B4%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="118" alt="Excel 2007 PivotTable with Dimension Security" src="http://lh5.google.com/davefacklerblog/R9hBTF4c4II/AAAAAAAAAPg/QGKNRB_wf3w/Excel%202007%20PivotTable%20with%20Dimension%20Security_thumb%5B1%5D" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;However, as soon as I try to drill-down to get to Amy, boom!!&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R9hBTl4c4JI/AAAAAAAAAPo/VNhG_q5L5OE/Error%20in%20Excel%202007%20PivotTable%20with%20Dimension%20Security%5B7%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="173" alt="Error in Excel 2007 PivotTable with Dimension Security" src="http://lh4.google.com/davefacklerblog/R9hBT14c4KI/AAAAAAAAAPw/Ro0yHnyctNo/Error%20in%20Excel%202007%20PivotTable%20with%20Dimension%20Security_thumb%5B4%5D" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Ugh. And to date, I've not been able to find a work-around. Anyone out there who has ideas on how to handle this, please let me know. I've tried defining the MDX expression in the security role in a couple of different ways and I've tried to tweak the pivot table settings in Excel 2007 in various ways. All to know avail. Uh, Microsoft, can we get this fixed (along with all the other ugly issues that exist when using Excel 2007 as a client for SSAS??)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-2025898301647741682?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/2025898301647741682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=2025898301647741682' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/2025898301647741682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/2025898301647741682'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/03/dimension-security-issues-with-excel.html' title='Dimension Security Issues with Excel 2007 and SSAS 2005 Parent-Child Hierarchies'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-6946186806294204342</id><published>2008-03-12T10:56:00.001-04:00</published><updated>2008-03-12T11:03:30.534-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><title type='text'>SSIS Package to Back Up SSAS Databases</title><content type='html'>&lt;p&gt;There are a couple of different posts and blog entries out there that discuss backing up SSAS databases using various techniques such as AMO, SSIS, etc.  I recently created an SSIS package to do the same thing, and I think it's a little bit simpler than some of the other solutions out there.&lt;/p&gt;&lt;p&gt;The basic design of the package is to use a ForEach Loop container to loop over the list of databases on a given SSAS server (versus using AMO or some other method of getting a list of databases) and then using an Analysis Services DDL task with an XMLA script that calls for a backup of the current database.&lt;/p&gt;&lt;p&gt;The figure below shows the overall control flow in the package:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R9fujl4c3tI/AAAAAAAAAMI/K237JMDiUxw/Control%20Flow%20for%20Backup%20SSAS%20Databases%20Package%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="200" alt="Control Flow for Backup SSAS Databases Package" src="http://lh5.google.com/davefacklerblog/R9fulV4c3uI/AAAAAAAAAMQ/Ywitz_X_1dQ/Control%20Flow%20for%20Backup%20SSAS%20Databases%20Package_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The ForEach Loop container uses the ADO.NET Schema Rowset Enumerator along with an ADO.NET connection to the SSAS server.  Thus, the package contains a Connection Manager using the .Net Provider for OLEDB along with the OLE DB Provider for Analysis Services 9.0.  Thus, the Connection Manager looks like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.google.com/davefacklerblog/R9fuoV4c3vI/AAAAAAAAAMY/ra6r0wOTFwM/Connection%20Manager%20for%20ADO.NET%20Connection%20to%20SSAS%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="244" alt="Connection Manager for ADO.NET Connection to SSAS" src="http://lh6.google.com/davefacklerblog/R9fuql4c3wI/AAAAAAAAAMg/Pi6-pusyPsg/Connection%20Manager%20for%20ADO.NET%20Connection%20to%20SSAS_thumb" width="233" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Notice the Provider selected, the Server name entered, and the fact that no Initial Catalog is selected (since we're going to loop over all of the catalogs with the ForEach loop container).  In this case, the Connection Manager just connects to the local SSAS server, but that could be dynamically handled with a package variable and a property expression on the Connection Manager.&lt;/p&gt;&lt;p&gt;The important settings for the ForEach Loop Container look like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R9fut14c3xI/AAAAAAAAAMo/URRMHIsBeC0/Collection%20Settings%20for%20ForEach%20Loop%20Container%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="Collection Settings for ForEach Loop Container" src="http://lh5.google.com/davefacklerblog/R9fuwV4c3yI/AAAAAAAAAMw/lsAVyhxi26Y/Collection%20Settings%20for%20ForEach%20Loop%20Container_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R9fuzl4c3zI/AAAAAAAAAM4/sRYKVoeHkDw/Variable%20Mappings%20Settings%20for%20ForEach%20Loop%20Container%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="Variable Mappings Settings for ForEach Loop Container" src="http://lh4.google.com/davefacklerblog/R9fu1F4c30I/AAAAAAAAANA/1oGESrhVgb4/Variable%20Mappings%20Settings%20for%20ForEach%20Loop%20Container_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that the Collections settings specify the ADO.NET Schema Rowset Enumerator, the defined Connection Manager, and the Catalogs schema.  Also note that the Variable Mappings tab specifies that the catalog name returned by the enumerator be stored in a package variable named DatabaseName.&lt;/p&gt;&lt;p&gt;Within the ForEach Loop container, you'll see a Script Task as well as an Analysis Services Execute DDL Task.  The Script Task is used to generate the XMLA script needed to backup the current database and the Analysis Services Execute DDL Task then executes that XMLA script.  The Script Task is configured as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R9fu4F4c31I/AAAAAAAAANI/dbrlLu4yfX8/Script%20Settings%20for%20Script%20Task%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="Script Settings for Script Task" src="http://lh4.google.com/davefacklerblog/R9fu6F4c32I/AAAAAAAAANQ/EiP3lEDraG8/Script%20Settings%20for%20Script%20Task_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that the DatabaseName variable is passed in as a read-only variable while another package variable named BackupScript is passed in as a read-write variable.  The script within the task looks like this:&lt;/p&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Main()&lt;br /&gt;    &lt;span style="color:#008000;"&gt;'&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;' Add your code here&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Dts.Variables.Item(&lt;span style="color:#006080;"&gt;"BackupScript"&lt;/span&gt;).Value = _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"&amp;lt;Backup xmlns="&lt;/span&gt;&lt;span style="color:#006080;"&gt;"http://schemas.microsoft.com/analysisservices/2003/engine"&lt;/span&gt;&lt;span style="color:#006080;"&gt;"&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"  &amp;lt;Object&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"    &amp;lt;DatabaseID&amp;gt;"&lt;/span&gt; + Dts.Variables.Item(&lt;span style="color:#006080;"&gt;"DatabaseName"&lt;/span&gt;).Value.ToString + &lt;span style="color:#006080;"&gt;"&amp;lt;/DatabaseID&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"  &amp;lt;/Object&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"  &amp;lt;File&amp;gt;"&lt;/span&gt; + Dts.Variables.Item(&lt;span style="color:#006080;"&gt;"DatabaseName"&lt;/span&gt;).Value.ToString + &lt;span style="color:#006080;"&gt;".abf&amp;lt;/File&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"  &amp;lt;AllowOverwrite&amp;gt;true&amp;lt;/AllowOverwrite&amp;gt;"&lt;/span&gt; + _&lt;br /&gt;&lt;span style="color:#006080;"&gt;"&amp;lt;Backup&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Dts.TaskResult = Dts.Results.Success&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sorry for the additional line wrapping in the code above, but the important point is that the BackupScript variable will contain a well-formed XMLA script for backing up the database named in the DatabaseName variable.  The script is fairly simple in nature as it simply uses a backup filename of the database name with .abf appended and it assumes the backup file can be overwritten.  Other scenarios could be handled (time-stamping the backup filenames, for example) via additional code.&lt;br /&gt;&lt;p&gt;Once the Script Task executes, the BackupScript variable is then ready to use to backup the current database (within the context of the ForEach Loop container).  The Analysis Services Execute DDL Task is configured to execute the backup script as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R9fu9l4c33I/AAAAAAAAANY/InaiLXqKdvg/DDL%20Settings%20for%20AS%20Execute%20DDL%20Task%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="DDL Settings for AS Execute DDL Task" src="http://lh5.google.com/davefacklerblog/R9fu_V4c34I/AAAAAAAAANg/zPlrMImMmnY/DDL%20Settings%20for%20AS%20Execute%20DDL%20Task_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that the Analysis Services Execute DDL Task uses a native OLE DB provider to connect to SSAS, not an ADO.NET provider.  Thus, a second Connection Manager is needed within the package to handle this connection.  It is configured as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R9fvDl4c35I/AAAAAAAAANo/vFQAZrVJq0M/Connection%20Manager%20for%20OLE%20DB%20Connection%20to%20SSAS%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="244" alt="Connection Manager for OLE DB Connection to SSAS" src="http://lh4.google.com/davefacklerblog/R9fvFF4c36I/AAAAAAAAANw/OJ0wUHd_FVo/Connection%20Manager%20for%20OLE%20DB%20Connection%20to%20SSAS_thumb" width="233" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that it is configured the same as the ADO.NET-based Connection Manager above, but uses a Native OLE DB provider.  Also note that the server name here could be made dynamic via a variable and a Property Expression as well.&lt;/p&gt;&lt;p&gt;And that's it.  If you run the package, it will loop through all of the databases on the SSAS server and backup each one.  If this needs to be done on a scheduled basis, the package can be easily deployed to one or more SSAS servers and scheduled using SQL Server Agent.&lt;/p&gt;&lt;p&gt;I've pushed a copy of the package up to my SkyDrive in case you want to take a look or even use it (as is of course!) yourself.  Here's a link to the zip file there:&lt;/p&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-14d36ba7f9ad51da.skydrive.live.com/embedrow.aspx/Blog%20Files/SSIS%20Package%20to%20Back%20Up%20SSAS%20Databases.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;p&gt;Let me know what you think...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-6946186806294204342?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/6946186806294204342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=6946186806294204342' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6946186806294204342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6946186806294204342'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/03/ssis-package-to-back-up-ssas-databases.html' title='SSIS Package to Back Up SSAS Databases'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-9019007579838702018</id><published>2008-03-05T21:09:00.001-05:00</published><updated>2008-03-05T21:26:39.903-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='SSRS'/><title type='text'>Current Date Parts for SSRS Reports using SSAS Cubes</title><content type='html'>&lt;p&gt;Recently, while working with a client on the development and deployment of a set of SSRS reports using SSAS as a data source, we came up with a nifty method of defaulting date-part report parameters to the current date.&lt;/p&gt;&lt;p&gt;When creating SSRS reports based on SSAS, a common scenario is to want date-part parameters that map to various attribute hierarchies within a date dimension. For example, in most SSAS solutions, a date dimension has attribute and user hierarchies that contain parts of a date. If these are added to a report as parameters, you might want the various date parts to default to parts of the current date. So, a report parameter based on a year attribute might need to default to the current year; a report parameter based on a month attribute might need to default to the current month.&lt;/p&gt;&lt;p&gt;Most solutions that I've seen to this problem go about it via MDX (by adding new "current date" calculated members to the date dimension) or via SSRS expressions (using various functions to create the right default values). The solution we came up with, however, relies on the fact that the date dimension in SSAS is typically processed from an underlying date table in the relational database used as the data source for SSAS. Let's look at an example of how this might work (using Adventure Works).&lt;/p&gt;&lt;p&gt;First, let's create a new report for Adventure Works using SSAS as the data source. In an SSRS project, you can use the Report Wizard to create a new report. Let's assume you need to create a report showing reseller sales, allowing users to filter the report by year and month. Using the Query Builder made available in the Report Wizard, we can create the following query for the report:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R89UAJaA4JI/AAAAAAAAAJk/ls3LYAM3GJ4/SSASQuery%5B1%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="174" alt="SSAS Query" src="http://lh3.google.com/davefacklerblog/R89Ri5aA34I/AAAAAAAAAJs/Jud8lCPtp_8/SSASQuery_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Notice the parameters that are included (for the [Date].[Calendar Year] and [Date].[Month of Year] attributes) along with the default values ([CY 2001] and [July] respectively) that I selected. After finishing the Report Wizard and then applying a bit of formatting to the report, here's what it might look like:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.google.com/davefacklerblog/R89RoZaA35I/AAAAAAAAAJw/s7BuYXmgY0U/InitialResellerSalesReport%5B1%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="186" alt="Initial Reseller Sales Report" src="http://lh4.google.com/davefacklerblog/R89RqJaA36I/AAAAAAAAAJ0/xY6qryzzLUU/InitialResellerSalesReport_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Notice the report parameters at the top, along with the default values that got filled in (based on the selections I made when the parameters were created in the Query Builder). If you inspect the report parameters, you can see what the format of each of the default values looks like:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R89RuJaA37I/AAAAAAAAAJ4/19Ocjp6t0s4/YearParameterDefaultValueFormat%5B1%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="193" alt="Year Parameter Default Value Format" src="http://lh3.google.com/davefacklerblog/R89Rv5aA38I/AAAAAAAAAJ8/YJAKzo8a-Lw/YearParameterDefaultValueFormat_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R89Rz5aA39I/AAAAAAAAAKA/lcEn4sjuWYM/MonthParameterDefaultValueFormat4%5B1%5D"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="193" alt="Month Parameter Default Value Format[4]" src="http://lh4.google.com/davefacklerblog/R89R2JaA3-I/AAAAAAAAAKE/-QzXeIdZdos/MonthParameterDefaultValueFormat4_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Notice that the default for the year parameter is the string "[Date].[Calendar Year].&amp;amp;[2001]" and the default for the month parameter is the string "[Date].[Month of Year].&amp;amp;[7]". If you look at the designs of these attributes in the SSAS solution, these map to values in the key columns DimTime.CalendarYear and DimTime.MonthNumberOfYear.&lt;/p&gt;&lt;p&gt;Now, suppose users of this report want the year parameter to default to the current year and the month parameter to default to the current month. Within the AdventureWorksDW relational database, the following query returns the key columns listed above for each date in the DimTime table:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt;&lt;br /&gt;    CalendarYear&lt;br /&gt;    ,MonthNumberOfYear&lt;br /&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt;&lt;br /&gt;    dbo.DimTime&lt;/pre&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;p&gt;If we apply some formatting to the columns returned, we can get values back that look like the default parameter strings noted above:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt;&lt;br /&gt;    &lt;span class="str"&gt;'[Date].[Calendar Year].&amp;amp;['&lt;/span&gt;&lt;br /&gt;        + &lt;span class="kwrd"&gt;convert&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;, CalendarYear)&lt;br /&gt;        + &lt;span class="str"&gt;']'&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; CalendarYearValue&lt;br /&gt;    ,&lt;span class="str"&gt;'[Date].[Month of Year].&amp;amp;['&lt;/span&gt;&lt;br /&gt;        + &lt;span class="kwrd"&gt;convert&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;, MonthNumberOfYear)&lt;br /&gt;        + &lt;span class="str"&gt;']'&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; MonthofYearValue&lt;br /&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt;&lt;br /&gt;    dbo.DimTime&lt;/pre&gt;&lt;p&gt;And if we apply a where clause to the query, then we can return the formatted values for a single date -- in particular, the current date (likely using the getdate() function). Now, in the AdventureWorksDW database, the DimTime table doesn't have dates up through the current date; thus, we'll simply ask for the maximum date in the table. And we'll wrap this query into a stored procedure named dbo.GetDefaultDateParts:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;procedure&lt;/span&gt; dbo.GetDefaultDateParts&lt;br /&gt;&lt;span class="kwrd"&gt;as&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt;&lt;br /&gt;    &lt;span class="str"&gt;'[Date].[Calendar Year].&amp;amp;['&lt;/span&gt;&lt;br /&gt;        + &lt;span class="kwrd"&gt;convert&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;, CalendarYear)&lt;br /&gt;        + &lt;span class="str"&gt;']'&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; CalendarYearValue&lt;br /&gt;    ,&lt;span class="str"&gt;'[Date].[Month of Year].&amp;amp;['&lt;/span&gt;&lt;br /&gt;        + &lt;span class="kwrd"&gt;convert&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;, MonthNumberOfYear)&lt;br /&gt;        + &lt;span class="str"&gt;']'&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; MonthofYearValue&lt;br /&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt;&lt;br /&gt;    dbo.DimTime&lt;br /&gt;&lt;span class="kwrd"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;--    FullDateAlternateKey = convert(varchar, getdate(), 101)&lt;/span&gt;&lt;br /&gt;    FullDateAlternateKey =&lt;br /&gt;    (&lt;br /&gt;    &lt;span class="kwrd"&gt;select&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;max&lt;/span&gt;(FullDateAlternateKey)&lt;br /&gt;    &lt;span class="kwrd"&gt;from&lt;/span&gt;&lt;br /&gt;        dbo.DimTime&lt;br /&gt;    )&lt;/pre&gt;&lt;p&gt;With this stored procedure in place, we can now update the report to use these new default values. First, we need to add a new data set to the report, based on the AdventureWorksDW relational database, calling this new stored procedure. Here's what the properties for the new data set might look like:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R89R5JaA3_I/AAAAAAAAAKI/R4hPoSLOr5w/Data%20Set%20for%20GetDefaultDateParts%20Stored%20Procedure%5B5%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="203" alt="Data Set for GetDefaultDateParts Stored Procedure" src="http://lh5.google.com/davefacklerblog/R89R7ZaA4AI/AAAAAAAAAKM/V_bQdOrLqVQ/Data%20Set%20for%20GetDefaultDateParts%20Stored%20Procedure_thumb%5B2%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;And here's what a query of the data set would return:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/davefacklerblog/R89R-paA4BI/AAAAAAAAAKQ/X7WoVX99i1w/GetDefaultDateParts%20Data%20Set%20Results%5B5%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="68" alt="GetDefaultDateParts Data Set Results" src="http://lh4.google.com/davefacklerblog/R89SAJaA4CI/AAAAAAAAAKU/WBkhBsiudL0/GetDefaultDateParts%20Data%20Set%20Results_thumb%5B2%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;So, with this new data set available, we can simply update the report parameters such that each parameter's default value comes from the data set (instead of being based on the values that were originally selected when the report parameters were created). Here are the updated report parameters:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R89SDJaA4DI/AAAAAAAAAKY/1ECtA6aPIlk/Updated%20Calendar%20Year%20Report%20Parameter%5B5%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="193" alt="Updated Calendar Year Report Parameter" src="http://lh5.google.com/davefacklerblog/R89SGZaA4EI/AAAAAAAAAKc/2b2Z1nE1a7I/Updated%20Calendar%20Year%20Report%20Parameter_thumb%5B2%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R89SJ5aA4FI/AAAAAAAAAJE/JnfoatKJwbw/Updated%20Month%20of%20Year%20Report%20Parameter%5B3%5D"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="193" alt="Updated Month of Year Report Parameter" src="http://lh3.google.com/davefacklerblog/R89SL5aA4GI/AAAAAAAAAJM/LnOevRTyBVc/Updated%20Month%20of%20Year%20Report%20Parameter_thumb" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that each parameter has been set to be single-valued (although this doesn't necessarily have to be the case) and that each parameter now gets its default value from the appropriate field of the new data set.&lt;/p&gt;&lt;p&gt;Finally, previewing the report will show that the parameters get filled in with our new default values (2004 for the year and August for the month):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R89SPJaA4HI/AAAAAAAAAKg/pNrkLrrW0cM/Report%20with%20New%20Default%20Values%20for%20Parameters%5B5%5D" target="target"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="93" alt="Report with New Default Values for Parameters" src="http://lh4.google.com/davefacklerblog/R89SRJaA4II/AAAAAAAAAKk/Szc_EFjRmik/Report%20with%20New%20Default%20Values%20for%20Parameters_thumb%5B2%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Now, in this particular case, it looks like Adventure Works didn't have any reseller sales for August 2004. So, the default values we created via the new stored procedure might not be optimal. But, now that we have a stored procedure for returning the default values, it could be updated to return the date parts for the last date with data, the last date of the last "closed" financial month, or just about anything else that makes sense for our users and our business scenario. The stored procedure could even be updated to accept parameter values to control it in various ways, with different reports calling for different dates for example.&lt;/p&gt;&lt;p&gt;There are certainly some cases in which this may not work. For example, if you are using an SSAS-based date dimension (with no underlying date table in the relational database) or if have a very slim date dimension table and are creating additional columns within your DSV. So, your mileage may vary. But, for quite a number of scenarios and situations, this seems to work out well and avoids some of the complexity I've seen people create just to do this type of thing.&lt;/p&gt;&lt;p&gt;I've uploaded a copy of the Reseller Sales report sample displayed above along with a T-SQL script for creating the stored procedure. Both are available here:&lt;/p&gt;&lt;p&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-14d36ba7f9ad51da.skydrive.live.com/embedrow.aspx/Blog%20Files/Current%20Date%20Parts%20for%20SSRS%20Reports%20using%20SSAS%20Cubes.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;Give it a try and let me know if this seems like a useful technique...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-9019007579838702018?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/9019007579838702018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=9019007579838702018' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/9019007579838702018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/9019007579838702018'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/03/current-date-parts-for-ssrs-reports.html' title='Current Date Parts for SSRS Reports using SSAS Cubes'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-659508021203387207</id><published>2008-02-24T19:14:00.001-05:00</published><updated>2008-02-24T19:14:23.069-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>Incorrect Truncation Warning in SSIS</title><content type='html'>&lt;p&gt;I was working on an SSIS package a few weeks back and was puzzled by a truncation warning that two of the Data Flow tasks kept throwing out.&amp;#160; In the Data Flow, a string-based column of length 10 in the pipeline was being used as part of the input for an OLE DB Destination, which was storing the data into a SQL Server table.&amp;#160; The column being populated by this specific input column had a data type of varchar(20).&amp;#160; No problem, right?&lt;/p&gt;  &lt;p&gt;Well, the Data Flow task was generating a warning stating that the column of length 20 might be truncated when used to populate the column of length 10.&amp;#160; Huh?&amp;#160; Exactly what I thought.&amp;#160; Why was the Data Flow task complaining about that when clearly the column of length 20 was the destination and the column of length 10 was the source.&lt;/p&gt;  &lt;p&gt;I reviewed every property I could think of with regards to the source column, the destination column, the destination table, the OLE DB Destination component, the Data Flow task, etc.&amp;#160; Nothing I could find (at first glance) seemed out of place.&amp;#160; And even though the package ran fine (it was, after all, just a warning), it continued to bug me that something about the package was causing the SSIS engine to generate the warning.&lt;/p&gt;  &lt;p&gt;After scratching my head for quite some time, I finally found the answer.&amp;#160; It seemed that someone working on the package prior to my development work on it had set the ValidateExternalMetadata property on the OLE DB Destination to False.&amp;#160; This is typically done (in my experience) to keep a Data Flow task from complaining about the metadata of a destination table that doesn't exist yet (maybe it will be created in a step before the Data Flow task executes, for example).&amp;#160; Well, believe it or not, setting this property to False seemed to cause the SSIS engine to misinterpret the metadata information about the source and destination, in this case, swapping the column metadata.&lt;/p&gt;  &lt;p&gt;Here's a quick example to see this in action.&amp;#160; Create a Data Flow task in a package, add an OLE DB Source component, a Derived Column component, and an OLE DB Destination component.&amp;#160; For the OLE DB Source component, select a table from the AdventureWorks database (like the Production.Product table) and pick a character-based column.&amp;#160; Connect the OLE DB Source component to the Derived Column component.&amp;#160; In the Derived Column component, create a new column (with a new name) and use the SUBSTRING() function to make a shorter version of the string column.&amp;#160; Send the output of the Derived Column component to the OLE DB Destination, mapping the source to the original table, using the shorter column you created as the source for the column you originally picked from the table.&amp;#160; So, you end up with something like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="Simple Data Flow" src="http://lh4.google.com/davefacklerblog/R8IIMbjY9CI/AAAAAAAAAGs/mVCts9UVs6o/image21" width="174" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;In the OLE DB Source, I selected the Production.Product table and selected the Name field, which has a data type of nvarchar(50).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="OLE DB Source Component" src="http://lh6.google.com/davefacklerblog/R8IIO7jY9DI/AAAAAAAAAG0/RFgONrMa1_Q/image27" width="244" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;In the Derived Column component, I created a new column named ShorterName as follows:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="230" alt="Derived Column Component" src="http://lh5.google.com/davefacklerblog/R8IIRrjY9EI/AAAAAAAAAG8/CHajae4Nb5c/image23" width="244" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Finally, for the OLE DB Destination, I mapped the new ShorterName column back to the Name column:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="OLE DB Destination" src="http://lh6.google.com/davefacklerblog/R8IIT7jY9FI/AAAAAAAAAHE/6Xeuf_n2fh8/image24" width="244" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Now, there's no need to really run the package to see the warning.&amp;#160; Simply change the ValidateExternalMetadata property for the OLE DB Destination component from the default of True to False.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="213" alt="OLE DB Destination Properties" src="http://lh6.google.com/davefacklerblog/R8IIW7jY9GI/AAAAAAAAAHM/CcPdUFdvQ8k/image25" width="244" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;As soon as you do this, you'll see a warning icon on the OLE DB Destination component.&amp;#160; If you look at the warning in the Error List, you'll see something like the following:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Validation warning. Data Flow Task: OLE DB Destination [140]: Truncation may occur due to inserting data from data flow column &amp;quot;Name&amp;quot; with a length of 50 to database column &amp;quot;ShorterName&amp;quot; with a length of 40.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Note that the truncation warning has inverted the metadata involved, stating that (in this case) truncation may occur inserting data from the Name column to the database column ShorterName.&amp;#160; But, as is clearly the case, the database column (the destination) is the Name column while the ShorterName column is actually the source.&amp;#160; If you set the ValidateExternalMetadata column back to True, the truncation warning goes away.&lt;/p&gt;  &lt;p&gt;Strange behavior.&amp;#160; Again, just a warning that doesn't keep a given data flow from working properly.&amp;#160; But strange nonetheless.&amp;#160; I've posted this as a bug on Connect; if you come across it, feel free to comment or validate it.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=327577" href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=327577"&gt;http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=327577&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-659508021203387207?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/659508021203387207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=659508021203387207' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/659508021203387207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/659508021203387207'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/02/incorrect-truncation-warning-in-ssis.html' title='Incorrect Truncation Warning in SSIS'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-6247145417947942054</id><published>2008-02-22T17:50:00.000-05:00</published><updated>2008-02-22T14:50:42.446-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Using Connection Managers in SSIS</title><content type='html'>&lt;p&gt;Whenever I create SSIS packages, I typically create two different Connection Managers for use against SQL Server databases.  The first uses a standard OLE DB provider, like this one to the AdventureWorks database (which I typically name something like &lt;strong&gt;&lt;em&gt;AdventureWorks.OLEDB&lt;/em&gt;&lt;/strong&gt;):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R74cTLjY8mI/AAAAAAAAABU/SClVcVUBpd0/image%5B5%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="244" alt="AdventureWorks.OLEDB" src="http://lh5.google.com/davefacklerblog/R74cVrjY8nI/AAAAAAAAABg/QPmCBCY76vg/image_thumb%5B3%5D" width="233" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The second one, to the same database, uses an ADO.NET provider, like this one to the AdventureWorks database (which I typically name something like &lt;strong&gt;&lt;em&gt;AdventureWorks.ADONET&lt;/em&gt;&lt;/strong&gt;):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.google.com/davefacklerblog/R74cYrjY8oI/AAAAAAAAABo/EHtI6PFxEks/image%5B9%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="244" alt="AdventureWorks.ADONET" src="http://lh4.google.com/davefacklerblog/R74cbbjY8pI/AAAAAAAAABw/5ESbZkWLyqU/image_thumb%5B5%5D" width="233" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Now, here's why I set up these two different Connection Managers:&lt;/p&gt;&lt;p&gt;The OLE DB provider seems to be faster than the ADO.NET provider for getting data into and out of a SQL Server database.  Thus, in Data Flow tasks within the package, I use the first Connection Manager for OLE DB Source and OLE DB Destination components when hitting the database.  Thus:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R74cdbjY8qI/AAAAAAAAAB4/M8KJtjXQKPA/image%5B13%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="145" alt="Data Flow Task" src="http://lh3.google.com/davefacklerblog/R74ciLjY8rI/AAAAAAAAACA/k8Wvy1EAZF8/image_thumb%5B7%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;However, as anyone who has used the Execute SQL task along with an OLE DB-based Connection Manager will tell you, dealing with stored procedures and their parameters isn't the most elegant.  If the Execute SQL task uses an OLE DB-based Connection Manager, then calls to stored procedures look like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R74cmLjY8sI/AAAAAAAAACI/Eb4HLpcz3Ks/image%5B17%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="198" alt="Stored Procedure with Positional Parameters" src="http://lh5.google.com/davefacklerblog/R74corjY8tI/AAAAAAAAACQ/pw1LyS4WpqE/image_thumb%5B9%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;In the Parameter Mappings tab of the task, the parameters then have to be specified using positional numbers, starting with 0.  So, for the example above, you'd have to set up mappings to parameters as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R74csLjY8uI/AAAAAAAAACY/qhxOQgtX0Ag/image%5B21%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="Positional Parameter Names" src="http://lh3.google.com/davefacklerblog/R74cuLjY8vI/AAAAAAAAACg/xSdQD9zwLeI/image_thumb%5B11%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;If, on the other hand, you use an ADO.NET-based Connection Manager with the Execute SQL Task, things are a bit more elegant.  In this case, you can simply specify the name of the stored procedure without any positional parameter markers:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.google.com/davefacklerblog/R74cxLjY8wI/AAAAAAAAACo/67GCdCOdryo/image%5B28%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="230" alt="Stored Procedure Name Only" src="http://lh4.google.com/davefacklerblog/R74c0bjY8xI/AAAAAAAAACw/2b5ajYTWR7I/image_thumb%5B14%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note the property called &lt;strong&gt;&lt;em&gt;IsQueryStoredProcedure&lt;/em&gt;&lt;/strong&gt; below the name of the stored procedure.  When an OLE DB-based Connection Manager is used (as in the first example above), this property is set to &lt;strong&gt;&lt;em&gt;False&lt;/em&gt;&lt;/strong&gt; and is grayed out.  Now, however, with an ADO.NET-based Connection Manager, the property can be set to &lt;strong&gt;&lt;em&gt;True&lt;/em&gt;&lt;/strong&gt; whenever a stored procedure name is provided.  As for the parameters, they can now be mapped using the actual parameter names within the stored procedure:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/davefacklerblog/R74c3bjY8yI/AAAAAAAAAC4/K36Q7b6iciw/image%5B29%5D" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="236" alt="Actual Parameter Names" src="http://lh3.google.com/davefacklerblog/R74c6LjY8zI/AAAAAAAAADA/ShFHLvTzXhs/image_thumb%5B15%5D" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;To me, this is much more intuitive and elegant.  And, when you build lots of SSIS packages (for an ETL process, for example), you almost always have more than a few stored procedure calls that need to be made before Data Flow tasks, after them, in Event Handlers, etc.  Thus, although it seems somewhat silly to have two Connection Managers to the same database, using one for each of the different providers for SQL Server allow you to have the best of both worlds -- good performance for getting data into and out of a database, and good (or at least better) stored procedure handling for parameter names and mapping.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-6247145417947942054?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/6247145417947942054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=6247145417947942054' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6247145417947942054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6247145417947942054'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/02/using-connection-managers-in-ssis.html' title='Using Connection Managers in SSIS'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-7143935924836671035</id><published>2008-02-21T16:32:00.001-05:00</published><updated>2008-02-21T19:56:44.360-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Relational'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Using Schemas to Organize Data Warehouse Objects</title><content type='html'>&lt;p&gt;Over the last several years, I've adopted the practice of using schemas to organize data warehouse objects in the SQL Server database created as part of a BI solution. I've found this is a good way to differentiate the objects based on their purpose. And its freed me from having to use suffixes or prefixes as I'd been doing for several years.&lt;/p&gt;&lt;p&gt;For example, in my early days of designing BI solutions, I'd often use table names like &lt;strong&gt;DimDate&lt;/strong&gt;, &lt;strong&gt;DimProduct&lt;/strong&gt;, and the always funny &lt;strong&gt;DimCustomer&lt;/strong&gt; and &lt;strong&gt;DimEmployee&lt;/strong&gt; for dimension tables. And things like &lt;strong&gt;FactSales&lt;/strong&gt;, &lt;strong&gt;FactInventory&lt;/strong&gt;, and &lt;strong&gt;FactCalls&lt;/strong&gt; for fact tables. This organized things fairly well, but always felt a bit artificial.&lt;/p&gt;&lt;p&gt;With the introduction of schemas to SQL Server databases, however, I've standardized on a set of schemas for every data warehouse database I design. The tables above would then be named &lt;strong&gt;Dim.Date&lt;/strong&gt;, &lt;strong&gt;Dim.Product&lt;/strong&gt;, &lt;strong&gt;Dim.Customer&lt;/strong&gt;, and &lt;strong&gt;Dim.Employee&lt;/strong&gt; (as tables built within the &lt;strong&gt;&lt;em&gt;Dim&lt;/em&gt;&lt;/strong&gt; schema) along with &lt;strong&gt;Fact.Sales&lt;/strong&gt;, &lt;strong&gt;Fact.Inventory&lt;/strong&gt;, and &lt;strong&gt;Fact.Calls&lt;/strong&gt; (as tables built within the &lt;strong&gt;&lt;em&gt;Fact&lt;/em&gt;&lt;/strong&gt; schema). Likewise, if I have views, stored procedures, functions, etc. that are related to the dimensions, they get created in the &lt;strong&gt;&lt;em&gt;Dim&lt;/em&gt;&lt;/strong&gt; schema while those related to the fact tables get created in the &lt;strong&gt;&lt;em&gt;Fact&lt;/em&gt;&lt;/strong&gt; schema.&lt;/p&gt;&lt;p&gt;Overall, I generally create the following schemas right out of the gate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Dim&lt;/em&gt;&lt;/strong&gt; -- used for all objects related to the dimensions in the model&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Fact&lt;/em&gt;&lt;/strong&gt; -- used for all objects related to the facts in the model&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Audit&lt;/em&gt;&lt;/strong&gt; -- used to hold objects related to auditing, generally a feature of the ETL process that loads the dimensions and facts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;ETL&lt;/em&gt;&lt;/strong&gt; -- used to hold objects directly related to the ETL process (configuration values, processing directives, etc.)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Stage&lt;/em&gt;&lt;/strong&gt; -- used to hold all objects needed for staging data during the ETL process&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In some cases, I've used other schemas to hold objects specific to a given solution or implementation. For example, I've been known to create the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;History&lt;/em&gt;&lt;/strong&gt; -- used to hold objects related to storing historical copies of data (for example, when you update a dimension record and need the pre-update version of the record just in case)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Report&lt;/em&gt;&lt;/strong&gt; -- used to hold objects specifically used by reporting applications (such as views and stored procedures used directly by SSRS)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And while I know that schemas are generally used for security purposes, the ability to quickly glance at a list of tables, views, and stored procedures and know what they're there for is great. And since SSMS shows lists of objects alphabetically by schema, the list of tables and such are organized by schema. Pretty handy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-7143935924836671035?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/7143935924836671035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=7143935924836671035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/7143935924836671035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/7143935924836671035'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/02/using-schemas-to-organize-data.html' title='Using Schemas to Organize Data Warehouse Objects'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524597393242354846.post-6631590203579743197</id><published>2008-02-21T14:51:00.001-05:00</published><updated>2008-02-21T14:56:55.105-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>New Blog Up and Running</title><content type='html'>&lt;p&gt;For those of you who know me (and I realize that's a much smaller audience than I'd like to think sometimes), I'm finally getting around to doing the blog thing.&amp;#160; A while back, I attempted to start a blog up while with another consulting firm (which has all but vanished I think).&amp;#160; But I didn't really do much with that blog, so I'm starting this new one with high hopes!&lt;/p&gt;  &lt;p&gt;I've been working in the Microsoft BI space for quite a while now (having started with the alpha bits of SQL Server 7.0 -- trying valiantly to figure out the programming model for DTS before BOL existed -- on a project in Atlanta).&amp;#160; Since that time, I've come to have a pretty decent understanding of Microsoft's BI stack -- including just enough to be dangerous with MOSS.&amp;#160; But my focus continues to be the core components of SSIS and SSAS.&amp;#160; So, more than likely, that's what you'll see the most of in this blog.&lt;/p&gt;  &lt;p&gt;Over the course of the next few weeks (and months), I hope to get a number of things posted with regards to the current versions of the tools (aka, SQL Server 2005).&amp;#160; As I get more opportunities to start using the new release, I'll start to post about that.&amp;#160; Hopefully, you'll find a good nugget or three to take away and use on your next BI implementation...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524597393242354846-6631590203579743197?l=davefackler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davefackler.blogspot.com/feeds/6631590203579743197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=524597393242354846&amp;postID=6631590203579743197' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6631590203579743197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524597393242354846/posts/default/6631590203579743197'/><link rel='alternate' type='text/html' href='http://davefackler.blogspot.com/2008/02/new-blog-up-and-running.html' title='New Blog Up and Running'/><author><name>Dave Fackler</name><uri>http://www.blogger.com/profile/03798816395506158436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
