Crappy Code Games 2011 – London

Crappy Code Games 2011 – London

Great sponsors, wonderful people and awesome fun – this is how I would summarize the very first version of Crappy Code Games in London.Crappy Code Games 2011 For the uninitiated, Fusion-IO and SQLBits had coordinated to come up with a challenge for all the sql coders – to write the worst code. Yups, you heard it right, the worst code. Further details can be found on Simon Sabin’s (blog ¦ twitterpost. To recap, I was one of the very first to arrive around 6.00pm at the venue – Revolution Bar in Tower Hill. The venue started filling in by 7.00pm and it was so much of fun walking around and talking with all the SQL peeps. Oh ok, while the lesser mortals like me were busy drinking up the free beer and food, the Gods sat around the system, racking their brains and trying out the challenges. It looks like I was sort of a lucky mascot today, 3 people who were standing near me got an Apple Ipod in the lucky draw and Neil Hambly (blog ¦ twitter), whom I was cheering, ended up getting the first prize in the event. Neil Hambly at work The ambience was pretty dark, so couldn’t get any nice photos but I couldn’t resist the urge to paste this half-baked blurry photo of the victors in the podium. Neil Hambly and the winners with their prizes A Sony Vaio laptop and 2 XBOXes, the sponsors rocked! Thanks a lot Fusion-IO, once again. If you guys are wondering why I am thanking Fusion-IO again and again, check out the free goodies which I got.Crappy Code goodies All warmed up for the SQLBits event at Brighton now!

Posted by SQLJason, 1 comment
Where to store calculated measures – SSAS cube or SSRS reports?

Where to store calculated measures – SSAS cube or SSRS reports?

As I mentioned in one of my previous posts, nowadays I am busy preparing the design document of my new project and sending it around for reviews. If there is one question I could pick from the list that keeps coming back to me frequently, that would be this – why are you recommending to store all the report level calculations in the cube rather than in the reports? Usually I get away by just answering it is better for query performance and the reports would come out faster. Of course, I didn’t see any value explaining the technical behind-the-scenes part on why the reports would come out faster to my reviewers (ok, I admit, I am just lazy). But this time, one of my over-zealous peers was adamant on knowing the reason and I decided to demonstrate it to him finally. Store calculated measure in cube demo Before I illustrate the actual demonstration, it is necessary to understand the importance of caching in SSAS. Designing a system which will optimally utilize the caching feature is very critical for query performance and user experience. To quote SSAS 2008 Performance Guide “ During the execution of an MDX query, the query processor stores calculation results in the query processor cache. The primary benefits of the cache are to optimize the evaluation of calculations and to support reuse of calculation results across users. To understand how the query processor uses caching during query execution, consider the following example. You have a calculated member called Profit Margin. When an MDX query requests Profit Margin by Sales Territory, the query processor caches the non null Profit Margin values for each Sales Territory. To manage the reuse of the cached results across users, the query processor distinguishes different contexts in the cache: • Query Context—contains the result of any calculations created by using the WITH keyword within a query. The query context is created on demand and terminates when the query is over. Therefore, the cache of the query context is not shared across queries in a session.
Session Context —contains the result of any calculations created by using the CREATE statement within a given session. The cache of the session context is reused from request to request in the same session, but it is not shared across sessions.
Global Context —contains the result of any calculations that are shared among users. The cache of the global context can be shared across sessions if the sessions share the same security roles. The contexts are tiered in terms of their level of reusage. At the top, the query context is can be reused only within the query. At the bottom, the global context has the greatest potential for reusage across multiple sessions and users. “ So, in short, calculations defined in Query Context can be reused only within the query while calculations defined in Global context can be reused across sessions. This means that measures which are defined within the global scope will come out faster after the first time it has been run (since it is already there in the cache) compared to the query scope measures. Now let us see what happens when we execute an MDX query with the same calculation defined within a report and within a cube. For the demonstration, I would be using the Adventure Works cube and the following calculation – ([Measures].[Internet Sales Amount] / 2) +1 Option 1 – Make calculated member within SSRS Report 1) Make a simple report dataset with the following query WITH MEMBER [measures].[non cache] as
[Measures].[Internet Sales Amount]/2 +1
SELECT NON EMPTY { [measures].[non cache] } ON COLUMNS,
NON EMPTY { ([Customer].[Customer Geography].[State-Province].ALLMEMBERS ) }  ON ROWS
FROM [Adventure Works] non cache is the name of the new calculated measure. 2) Use the fields from the query to make a simple table in the layout. Report Layout 3) Before previewing the report, clear the cache of the database cache by running the following XMLA query in Management Studio. <ClearCache xmlns=”“>
    <DatabaseID>Adventure Works DW</DatabaseID>
</ClearCache> 4) Keep SQL Server profiler ready and preview the report now. You would be getting the below activity in the trace 1 query scope measure - after cache clearing We can see some Progress Report Begin and End events which indicates that some I/O is happening to fetch the data. The EventSubClass column of Query Subcube event clearly says that the data being fetched is non-cache data, as expected. 5) Now refresh the report once again and check out the profiler activity. 2 query scope measure - using cache We can see that there is a Get Data from Cache event. But on further observation, we can see that this data is from the measure group cache, which means that this is from the cache of the storage engine. Data would need to be passed back to the formula engine to execute any possible calculations, as is shown by the following AS querying architecture diagram. MDX Query execution architecture The formula Engine processes MDX Queries, figures out what data is needed to cover them, and forwards this information to the storage engine for retrieval. It then performs all calculations needed for the query. The Storage Engine handles all the reading and writing of data. It also retrieves and aggregates the data the formula engine requested at query run time. Now let us see what happens when we define the calculation inside the cube and use it in our reports. Option 2 – Make calculated member within SSAS Cube 1) Make the calculation in the calculated member script of the cube as shown below Create measure in cube cached is the name of the new calculated measure. 2) Edit the dataset query in the report to use the new measure SELECT NON EMPTY { [measures].[cached] } ON COLUMNS,
NON EMPTY { ([Customer].[Customer Geography].[State-Province].ALLMEMBERS ) } ON ROWS
FROM [Adventure Works] 3) Make the appropriate changes in the table also to include cached instead of non cache measure. Report Layout for cached measure 4) Before previewing the report, clear the cache of the database cache by running the following XMLA query in Management Studio. <ClearCache xmlns=”“>
<DatabaseID>Adventure Works DW</DatabaseID>
</ClearCache> 5) Keep SQL Server profiler ready and preview the report now. You would be getting the below activity in the trace 3 global scope measure - after cache clearing We can see that the activities and time are pretty much the same compared to the first approach when the cache was cleared. 6) Now refresh the report one more time and have a look at the profiler activity. 4 global scope measure - using cache Voila! Now we can see that there is a Get Data from Cache event and the Text Data clearly says that it is of Global Scope. The description in the EventSubClass column says that the data is from the calculation cache which means it is from the cache of the formula engine. Note : For the more inquisitive minds, the three main EventSubClass column values of the Get Data from Cache event are

  • 1 – Get data from measure group cache :- storage engine cache, so data from here would need to be passed back to the formula engine to have any calculations executed. This could mean that something in your query is not allowing the calculations to be cached in the formula engine. Some
  • 2 – Get data from flat cache :- formula engine cache, but this is used to store individual cell values and is only used when a query is executing in cell-by-cell mode. So if you see this it is an indication that your query is not executing in block mode
  • 3 – Get data from calculation cache :- formula engine cache and is probably the best type of cache because it is used in block mode and stores the final results of any calculation.

Conclusion Calculated measures defined within the report use the query context for caching while those defined within the cube uses the global context. Hence, from a query performance angle, it is always better to define measures within the cube than in the reports as the global context would be much faster after the first time the report has been run and also because the cache can be re-used across sessions. References This is an advanced topic and at least some of you would have found it a bit confusing (now you know why I don’t explain such stuff! Winking smile). You might want to take your time and go through the following references to know more about Storage Engine & Formula Engine or MDX performance tuning in general. 1) Microsoft SQL Server 2008 Analysis Services Unleashed (Book)
2) SSAS 2008 Performance Guide (Whitepaper)
3) Identifying and Resolving MDX Bottlenecks (Whitepaper)
4) Blogs by Mosha Pasumansky particularly
      a) Inside OLAP Engine: SE cache sharing
      b) Inside OLAP Engine: Cache Prefetching
      c) Take advantage of FE caching to optimize MDX performance
5) Blogs by Chris Webb particularly
      a) Formula Caching and Query Scope
      b) Reporting Services-generated MDX, Subselects and Formula Caching
      c) Missing Members and the Formula Engine Cache
      d) Now() and the Formula Cache
      e) Arbitrary-shaped sets and the Storage Engine cache

Posted by SQLJason, 1 comment
SQL Server Tsql Quiz 2011

SQL Server Tsql Quiz 2011

Are you one of those who have always wanted to own an Ipad the moment it hit the stores and yet never did because it could burn a hole in your pocket? Are you one of those who like pitting their SQL brains against the rest of the universe and showing them who’s daddy? Or are you one of those who like to read and increase knowledge about SQL Server? If you have answered yes to any of the above questions, it’s time to check out the new boy in the town. BR TSQL Quiz March 2011 BeyondRelational has coordinated with 31 Microsoft MVPs / experts and come up with this SQL Server feast for all you aficionados. You get to answer questions from some of the best SQL brains out there – every day of the month! And best of all, you even get a chance to win an Ipad sponsored by Redgate!! Have a sneak peek of the quiz masters below BR Quiz masters Don’t forget to check out the upcoming quizzes while you are there. And ofcourse, dare you forget to thank me when you get that nice little Ipad Smile.

Posted by SQLJason, 1 comment
Bubble Heatmap in SSRS Map Reports

Bubble Heatmap in SSRS Map Reports

Nowadays, the project that I am working on is keeping me quite busy and all the documentation work is driving me nuts (you wouldn’t believe me if I said I hate documentation Smile). But somehow, I do find time to respond to the steady flow of queries that keep coming  to me. And today, when one of my colleagues asked me how to implement bubble heatmap in SSRS map reports, I couldn’t resist the temptation to try it out at home and blog it down. Bubble Map Report For demonstrating the solution, I have downloaded a map of Africa along with some statistics on AIDS. Follow the steps below to implement the solution:- 1) Import the shapefile of Africa into the database (Read the first part of Import Shapefiles into SQL Server and Aggregate Spatial Data (Geometry) for more details). This is not a necessary step, but I find it easier to deal with spatial data in a table rather than reading from the shapefile at runtime or embedding it within the report. [Shape2SQL for geometry shapefile conversion[9].png] 2) For the demonstration purpose, I have created two datasets in BIDS – one which will give the statistics on AIDS and the other one which will return the spatial data from the database. 1 Prepare Datasets 3) Now drag and drop a Map item from the toolbox and select the source of spatial data as SQL Server spatial query. Click Next. 2 Choose source of spatial data 4) Choose the dataset which has the spatial data and click on next. 3 Choose spatial dataset 5) In the next screen, the spatial field should automatically be detected and we can click on next straightaway. 4 Choose spatial data 6) Choose Color Analytical Map as the visualization technique and click next. 5 Choose map visualization 7) Choose the analytical dataset containing the statistics in the screen that comes and then click on next. 6 choose analytical dataset 8) Specify the common field in the spatial and analytical dataset which would be used for linking the map and the statistics. In this case, it is the Country field. Click on next. 7 Specify match fields 9) In the next screen, choose any of the option as we will soon be disabling the visualization in the next step. Click on Finish. 8 Choose color theme 10) Click twice on the map and press F4 to bring the MapPolygonLayer properties. Now disable polygon color rule as shown in the image below 9 Disable polygon color rule 11) Right click on the map and select the Show Center Points option 10 Select Show Center Points 12) Now, on right clicking the map again, the Center Point properties should be enabled and we can change the Center Point Color rule and Center Point Size rule. 11 Center Point size and color rule 13) After the above step and bit more messing up with the aesthetics, we end up with the final end result as shown below Bubble heatmap I am writing this post well past my bed time and so if I have missed out any vital steps, feel free to ask them in the comments section. I should be more than happy to detail them out for you. Time to catch a few winks now…Sleepy smile Update (15/03/2011) I had forgot to mention that this approach is for polygon based maps. If you have got a point based map, then the wizard itself will give you options to set bubble size and colour.

Posted by SQLJason, 6 comments
Microsoft Community Contributor Award 2011

Microsoft Community Contributor Award 2011

Just around a week ago, I had blogged about completing one year of active participation in the Microsoft communities. Today morning, I was pleasantly surprised to see the following mail in my inbox MCCA letter I am deeply humbled (and a little worried on where I would place the MCCA logo on my already overcrowded sidebar Smile) on receiving this and hopefully, the access to complimentary resources will act as an extra motivational factor for me to continue my activities. Well, enough of the boring acceptance speech and time to flaunt my latest logo MCC_Logo_NEW MCCA certificate

Posted by SQLJason, 8 comments
PowerPivot tutorial videos

PowerPivot tutorial videos

Waking up early morning for a technical webinar is so not me (I really love to have my sleep in the morning!); but then I was very interested in the PowerPivot webinar which was going to be taken by Rupesh Patric (Microsoft Partner Technical Consultant and an accomplished artist) exclusively for people from my company, MindTree Ltd. As I was the only one from UK, the time was adjusted for the majority people in India which meant I had to wake up early. Ofcourse, I knew I wouldn’t regret losing my beauty sleep from the very moment the presentation started and overall, it was a good introduction to PowerPivot. To top it all, Rupesh sent a goodie pack containing some video tutorials for PowerPivot and I thought it would be too selfish of me if I didn’t share it with you guys. powerpivot-logo Materials 1.     Deck : SQL Server 2008 R2 Overview 2.    Book : Introducing SQL Server 2008 R2 3.     Hands On Lab – PowerPivot in SQL Server 2008 Set 1 1.     Presentation What’s New in the Excel 2010 Client 2.     Demo What’s New in the Excel 2010 Client 3.     Presentation Loading and Preparing Data for Analysis in SQL Server PowerPivot for Excel 2010 4.     Demo Loading and Preparing Data for Analysis in SQL Server PowerPivot for Excel 2010 5.     Presentation Creating Reports with SQL Server PowerPivot for Excel 2010 6.     Demo Creating Reports with SQL Server PowerPivot for Excel 2010 7.     Presentation Defining DAX Calculations with PowerPivot for Excel 2010 8.     Demo Defining DAX Calculations with SQL Server PowerPivot for Excel 2010 Set 2 1.     Part 0 Installing the PowerPivot Add-In for Excel 2.     Part 1 Using the PowerPivot Add-in to Import Data into Excel 2010 3.     Part 2 Import data from a SQL Server Database 4.     Part 3 Import Data from an Access Database 5.     Part 4 Using Copy-Paste to Import Excel data 6.     Part 5 Using a Linked Excel table to Import data 7.     Part 6 Compressed data in PowerPivot for Excel 8.     Part 7 Handling big data in PowerPivot for Excel 9.     Part 8 Importing SAP data in PowerPivot for Excel 10.  Part 9 Reports as data sources in PowerPivot for Excel 11.  Relationships – 1 Overview 12.  Relationships – 2 Creating Relationships If you are interested in Business Intelligence video tutorials, I would recommend you to visit Microsoft’s Channel 9, plenty more of the good stuff there. Update (18/03/2011) Another great Microsoft Technet resource – PowerPivot for Excel (Business Intelligence) was brought to my notice by Michele Hart (Microsoft). This site serves as a one-stop place for your PowerPivot requirements, be it articles, whitepapers, blogs, samples, videos or information about PowerPivot books. But the best part is the Virtual Lab where you can actually work and get your hands dirty on a system. Check it out!

Posted by SQLJason, 1 comment
1 year of activity in MSDN Forums

1 year of activity in MSDN Forums

Even though I had joined the MSDN Forums way back in 2009, I started using it regularly only from 2010 February. Looking back, it’s been a wonderful journey and I should say I have learned a lot from all of you wonderful guys contributing there. I didn’t do pretty bad myself as I raked in 6556 points from 1158 posts with 392 answers, all in the past one year. MSDN Profile My activity at the forums inspired me to take my career to the next level and even my blogs and networking are a direct result of this. In the past few months, my activity has reduced considerably but I intend to catch up soon and make up for it. I am also planning on getting more involved in the user group activities and taking some sessions, but more on it later.

Posted by SQLJason, 1 comment
Display Current Page Total in Footer

Display Current Page Total in Footer

There is one interesting story about NASA floating around the internet for quite some time now. The story goes like this – NASA spent millions to develop a pen that could write in space under zero gravity while the Soviet cosmonauts just used a pencil. Even though this is just a myth, I found it pretty interesting as sometimes even I tend to overdo things and come up with complicated answers when simple solutions exist. One of my latest blunders was on how to display current page totals of a multi-paged report in the footer. Page totals of current SSRS report For demonstrating the solution, I have made a dataset which will return a 1 or 0 based on whether all the students of a state has passed for a particular subject. Since the number of rows returned would be pretty large, the report will span over multiple pages. The requirement is to display the total number of pass and fails of the current page in the report footer. The steps are given below:- (I) Overkill Solution Thinking there is no straight forward way of doing this, I tried to devise the solution by applying the concepts of limiting rows in a page and custom code. 1) In the design mode of BIDS, create a matrix with State, Sector and the Pass/Fail measure. Then use the technique detailed in this blog by Melissa Coates to limit rows on a page. SSRS Limit rows in a page The expression that I have used for this demo is =Ceiling(Rownumber(Nothing)/12) as I need to limit 12 rows in my page. This can be modified as per your requirements. 2) Click on Report on the top menu and then select Report Properties. Navigate to the Code section and paste the custom code given below Dim public Sales as Integer
Dim public Shared FirstMember as Integer
Dim public Cnt as Integer=0 Public Function FindFirst(ByVal Sales AS Integer ) AS Integer
if (Cnt mod 12) = 1 then 
End If
return Sales
End Function This code will sum up the values which are passed as input to the function and keep the result in FirstMember variable. Since we know that only 12 rows will be displayed in one page, a counter variable is used to reset the value of FirstMember once the 13th row or multiples of it are reached. Thus it is ensured that the sum of the values in each page can be obtained by accessing the FirstMember variable. 3) Edit the measure expression in the matrix and paste the following code there =Code.FindFirst(Sum(Fields!GHE.Value)) This expression will invoke the function and pass the measure value each time a row is displayed. Using function in expression GHE is the name of my measure and Fields!GHE.Value should be substituted by your measure name. 4) Now you can directly use the following expressions in a textbox in your footer to get the number of pass and fail in each page. =”No of Pass in current Page =” & Code.FirstMember =”No of Fail in current Page =” & 12-Code.FirstMember If the number of rows that you are using is something other than 12, then it should be substituted accordingly in the expression for number of fails. Preview of report (II) Simple Solution 1) Make a simple matrix with the required columns and measure (Here, the columns are State and Sector & the measure is GHE) 2) Paste the following expression in a textbox in the footer =”No of Pass in current Page =” & Sum(ReportItems(“GHE”).Value) =”No of Pass in current Page =” & Sum(iif(ReportItems(“GHE”).Value=0,1,0)) The GHE in ReportItems(“GHE”).Value is the name of the textbox in which the measure is placed. The name of the textbox can be got by right clicking on the textbox and then pressing F4. Textbox name 3) Now the report can be previewed and the same result can be viewed. Moral of the blog is to make sure that you do your research properly and then get it reviewed by your peers before coming up with complex solutions.

Posted by SQLJason, 2 comments
Rotate Text in SSRS

Rotate Text in SSRS

Sometimes we get pampered so much by modern technology that we tend to raise the bar of necessity towards the fringes of luxury. 10 years back, a mobile phone was a luxury in my native place. Today, even school children carry one along with them and most of them take it as granted. Similarly, I had been so used to the rich features of SSRS 2008 R2 that I often forget that this feature never existed in the previous versions. Take this case where one of the forum users had asked me how to rotate text in the matrix column header of a SSRS report as shown below.

Rotate text report

Being used to SSRS 2008 R2, I thought rotating text to 270° was a pretty easy solution but I conveniently forgot that this feature was not available directly in SSRS 2008 and below versions. So I decided to blog down the solution for both SSRS 2008 R2 and other versions. For detailing the solution, I have already created a dataset which will give me the greenhouse emissions of the states in the USA by sector. The requirement is to display all the states in the column header and the optimal way would be to rotate it and display vertically.

(I) SSRS 2008 R2

1) Select the column whose text you want to rotate and press F4 to bring up the properties panel.

Select column to rotate text and press F4 to open properties panel

2) Select the WritingMode property and select the value as Rotate270. (The Vertical selection will rotate the text by 90° instead of 270°)

SSRS WritingMode property

3) Now you can preview the report and the header text should be rotated by 270°.

Report with rotated text header in SSRS 2008 R2

You can also change the horizontal and vertical alignment as needed by selecting the appropriate values in the TextAlign and VerticalAlign properties.

(II) SSRS 2008 and 2005

Since this option is not available out of the box for older versions, we will have to use custom code in our report.

1) Open the report properties and paste the following custom code in the Code tab of report properties. (Note : I am in no way a coding expert and the following piece of code was collected by me quite some years ago and have lost track of it’s origins; hence could not attribute it to the original author. If you are or know the author, please let me know so that I can link it to you/the original post. I have also made some modifications and if any of you guys feel that it can be improved, please paste the improved code in the comments sections so that it can be used by others)

Function LoadImage(ByVal sImageText as String,ByVal sImageTextMax as String)
sImageTextMax= sImageTextMax.PadRight(40)
Dim iFontSize As Integer = 10 ‘//Change this as needed
Dim bmpImage As New Drawing.Bitmap(1, 1)
Dim iWidth As Integer = 0
Dim iHeight As Integer = 0

'// Create the Font object for the image text drawing.
Dim MyFont As New Drawing.Font("Arial", iFontSize, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point)
'// Create a graphics object to measure the text's width and height.
'Graphics(MyGraphics = Graphics.FromImage(bmpImage))
Dim MyGraphics As Drawing.Graphics = Drawing.Graphics.FromImage(bmpImage)
'// This is where the bitmap size is determined.
iWidth = MyGraphics.MeasureString(sImageTextMax, MyFont).Width
iHeight = MyGraphics.MeasureString(sImageTextMax, MyFont).Height
'// Create the bmpImage again with the correct size for the text and font.
'bmpImage = New Drawing.Bitmap(bmpImage, New Drawing.Size(iWidth, iHeight))
bmpImage = New Drawing.Bitmap(bmpImage, New Drawing.Size(iHeight, iWidth))
'// Add the colors to the new bitmap.
MyGraphics = Drawing.Graphics.FromImage(bmpImage)
MyGraphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
MyGraphics.TranslateTransform(0, iWidth)

MyGraphics.DrawString(sImageText, MyFont, New Drawing.SolidBrush(Drawing.Color.White), 0, 0)
Dim stream As IO.MemoryStream = New IO.MemoryStream
Dim bitmapBytes As Byte()
'Create bitmap
bmpImage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg)
bitmapBytes = stream.ToArray
Return bitmapBytes
End FunctionThe above code converts Now your code window should look like this

Custom code

2) Go to the References tab and add a reference to the System.Drawing assembly.
Adding reference to Drawing assembly

3) Click OK to save and close the report properties. Then drag and drop an image item from the toolbox to the column header which will popup the Image Properties window as shown below.
Adding image to column header

Make sure that the
(a) image source is set as Database,
(b) MIME type is set as image/jpeg
(c) Use this field has the following expression
=Code.LoadImage(Fields!State.Value,”District of Columbia”)
In the above expression, Fields!State.Value is the field value whose text should be rotated (in this case – State). It can be substituted with any string value also. The second parameter is ideally for the longest string in the values for Fields!State.Value and is just used so that all the text values start at the same position and for general aligning purposes. In the above example, I have directly hardcoded it as “District of Columbia” but you can change it such that the field with the maximum length is passed.

4) Click on OK and then preview the report. Now you should be able to see the report as shown below
Rotated text with SSRS 2008, 2005 and below versions

In case you are not getting the report properly, make sure that
(a) Image properties should be set as Original Size
Image property set as Original size
(b) there should be a grouping on the column where the image is placed by the Field that you want to group by, else only one value would be displayed.
Group by State field

I am sure there is more scope for improvement in the VB.NET code like adding a code such that the text can be left, right or centre aligned, reducing the padding in the left hand side, etc. Feel free to modify and improve the codeNerd smile.

Posted by SQLJason, 35 comments
How to Choose the Right Business Intelligence Technology to Suit Your Style

How to Choose the Right Business Intelligence Technology to Suit Your Style

In my roles as a technical lead and a consultant, I have been often posed with this question – which is the best BI tool for this set of requirements and what is the best mode of presentation for this? I learned to answer this question from the various experiences I had in my projects since the past few years. Well, I am glad to say that answering this question should not be much of an issue even for a less experienced person with the latest whitepaper that has been released by Microsoft – Choose the right business intelligence technology to suit your style (white paper) How to Choose the Right Business Intelligence Technology to Suit Your Style The title might be a bit deceptive as it talks only about the Microsoft BI suite, but hey, did you really expect something else to come out of Microsoft? Overall, it is a good read for anyone who wants to understand which MSBI tool to use where and when. Read and get enlightened.

Posted by SQLJason, 0 comments