PowerShell and SSIS


Up until now, most of my use of PowerShell has been against SSAS, but I recently had a need to setup a number of SSIS packages for some relatively large CSV files. My problem was that the CSV files had about 125 columns and 120 of them (10 years of monthly figures) need to be inserted into Numeric(18,5) columns in SQL Server. However the connection manager auto-detected these columns on my flat file connection manager as DT_FLOAT. Changing these columns to DT_NUMERIC and setting the scale to 5 quickly proved to be tedious.

So I fired up PowerShell Analyzer and started poking around. Unfortunately I soon found that the combination of SSIS and PowerShell proved to be a little problematic. I think that the issue comes about because PowerShell tries really hard to help you out as far as object types are concerned. It has this concept of Type Adapters which usually make things easier. Unfortunately under the covers it appears that the SSIS API's use a relatively thin .Net wrapper over the top of some COM objects. I don't know for sure, but I'm guessing that the COM might be there as a partial bridge from the unmanaged code through to .Net.

But in the case of PowerShell this is an issue as it seems to be able to "see" through some of the .Net objects and interfaces to the COM based code and no matter how I tried to cast some of these objects as a specific type, PowerShell kept returning them as System.__ComObject.

Not to be one to admit defeat (and being too lazy to edit 120 columns by hand) I pulled together some C# to work with the interfaces that I need and then exposed this as PowerShell cmdlets. This both simplified the script and got around the issue of PowerShell not casting to the interfaces I needed.

The following script opens a package, grabs a reference to the columns property of a given csv connection and then loops through the columns, changing all the datatypes and then finally saves the package.

add-PSSnapin powerSSIS $pkg = get-ssisPackage "C:\temp\Test Package.dtsx" $fileCon = $pkg.Connections["CSV file"] $col = $fileCon.Properties["Columns"].GetValue($fileCon)

 

for ($i = 4; $i -lt $col.Count; $i++) { $name = get-ssisflatfileColumnName $pkg "CSV File" $i if ($name.startsWith("Column")) { set-ssisflatfileColumnName $pkg "CSV File" $i "Mth$($i-2)" $c = get-SSISFlatFileColumn $pkg "CSV File" $i $c.DataType = [Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType]::DT_Numeric $c.DataPrecision = 18 $c.DataScale = 5 } } set-SSISPackage $pkg "C:\temp\Test Package.dtsx"

 

I have highlighted the cmdlets I built in red. There weren't many and the ones to open and save packages were not strictly necessary, they just helped take a few lines of plumbing code out of my script. It was really just the cmdlets that get and set the column name and the one that gets the column object that I could not do in "native" PowerShell.

I am still looking into this as I can't help feeling that there must be a better way of doing this, but at the moment everything I have tried has been unsuccessful.

If anyone has any experience in this area, or thinks that this is either a good or bad idea, I would be interested to hear from you.

author: Darren Gosbell | posted @ Monday, July 14, 2008 12:21 AM | Feedback (1)

MVP for another year!


MVP_FullColor_ForScreenI got an email from the MVP program this morning saying that I have received the MVP award for another year.

And congratulations goes out to Greg Galloway on being awarded as an MVP. Greg and I have work with on BIDSHelper and the Analysis Services Stored Procedure project together and he is one smart cookie :) 

author: Darren Gosbell | posted @ Wednesday, July 02, 2008 7:58 AM | Feedback (1)

Performance Point Monitoring - cannot connect to the specified server


Today I was moving a prototype dashboard off a virtual server onto a development server. I saved the workspace file and copied it over and I got the following error when I clicked the test button in the data source page - "Unable to connect to the specified server. Make sure the address is correct"

image

This was a bit puzzling as it was connecting to "localhost" so it should have worked fine on the dev server.

If you do a search in your favorite search engine for this error you will possibly come across the following Microsoft Knowledge base article http://support.microsoft.com/kb/953107 (I have not set this up as a link so that it does not get any extra "google juice") which recommends uninstalling .Net 3.5, uninstalling PPS and then re-installing PPS before installing .Net 3.5. I'm not even sure if this server has the .Net 3.5 framework installed on it. Luckily I'm a bit lazier than that :) Looking down a few more results in the search turned up a forum post where it mentioned that the name of the PPS server is saved inside the workspace (.bswx) file.

So I opened the options dialogue and checked in the Server tab.

image

And what do you know, the name of my vritual PPS Monitoring server name was embedded in the workspace file and it was this server that Dashboard Designer could not find, not the SSAS server. Once that was fixed everything started working again.

image

If the error message had have said either

"Unable to connect to the specified PPS Monitoring server. Make sure the address is correct"

or better yet, something like:

"Unable to connect to the PPS monitoring server http://virt2k3s:40000/WebService/PmService.asmx. Make check the Server Url in the options dialog and make sure it is correct"

I could have solved this without having to resort to a web search. I have found that PerformancePoint has a few other non-specific error messages like this which are quite frustrating. I know there is the concept of not putting too much detail in the error messages for security reasons, but this error message is almost useless.

Another interesting development that I stumbled across is that the Dashboard Designer does not even seem to know that it stores this setting. If you change only the server details and then close Dashboard Designer without explicitly saving it will not recognize that the .bswx file needs saving and will discard your edits.

Update 21 Jun 08: As Nick points out. He actually covered this issue and much more in his post on connection issues in PerformancePoint, so if you are having other connection issues in PPS you should definitely check out that post. I had read his post when he made it and I knew I had all my identities correct as I had already connect to this server and was able to access other scorecards on it.

The subtle thing that I had missed was that opening a .bswx file could change the connection of a workspace.

I was also using a PC that still had IE7 configured to use live search which I had throught was closing the gap with google, but I just checked and live search ranks Nick's post much lower than google. So I have also just taken the link tags off the url to the MS KB article so that I do not contribute to that particular article's search ranking.

author: Darren Gosbell | posted @ Saturday, June 21, 2008 12:02 AM | Feedback (1)

A Rose by any other name - MDX Formatting


A little while ago Jamie posted about how he formats SQL code which happens to be quite similar to the way I do it. But this then lead me to think about the equivalent formatting for MDX.

So if I get MDX like the following:

with member measures.ptd as 'sum(periodstodate([Date].[Calendar].[Month],
[Date].[Calendar].currentmember),[Measures].[Sales Amount] )',format_string = "currency"
select   {[Measures].[Measures].[Sales Amount] ,measures.ptd} on 0,
{[Date].[Calendar].[Month].&[2003]&[2].children} on 1 from [Adventure Works] where 
([Product].[Product Categories].[Category].&[1])

 

I will tend to change it to something like this:

 

WITH 
    MEMBER measures.ptd AS 
        SUM(
            PERIODSTODATE([Date].[Calendar].[Month]
                         ,[Date].[Calendar].CurrentMember
                         )
            ,[Measures].[Sales Amount] 
            )
        ,FORMAT_STRING = "currency"
SELECT   
    {Measures.[Sales Amount] 
    ,Measures.ptd} ON 0,
    {[Date].[Calendar].[Month].&[2003]&[2].children} ON 1 
FROM [Adventure Works]
WHERE ([Product].[Product Categories].[Category].&[1])

 

When formatting MDX I apply the following formatting guidelines:

  • All keywords are in uppercase
  • The main Keywords WITH, SELECT, FROM and WHERE are the only ones on the left margin, each at the start of the line
  • Each inline MEMBER or SET definition is on a new line and is indented and the expression for those members or sets is indented under the MEMBER/SET line
  • Member and Set definitions are never quoted as strings (unless you are still working in AS2000 where you have no choice in this matter)
  • Each axis is starts on a new line and if I have multiple members or expressions on an axis I will indent them
  • I never mix axis numbers and axis names, if I use ON COLUMNS, I will use ON ROWS, if I have used ON 0 (for the column axis) I will use ON 1 (for the rows).
  • I usually put commas at the start of the line (after indenting) not at the end

I often uppercase functions although I will also use Camel case as the mood strikes me, I find multi word functions like PeriodsToDate() can be a little easier to read in Camel case. And for some reason I prefer to put the comma that separates axis at the end of the line which is opposition to my guideline where I put all other commas at the start of the line. I don't have a good justification for why I do this, it's just the way I do it. :)

Interestingly I am probably not quite as strict with my MDX layout as I am with my SQL. I tend to find that the nesting of functions in MDX often requires decent layout in order to make it readable, but have not really come up with a set of rules that I am 100% happy with. I tend to find that I make compromises between line length and the number of lines.

So, how do you format your MDX?

Technorati Tags: ,

author: Darren Gosbell | posted @ Sunday, June 15, 2008 10:52 PM | Feedback (3)

A new Logo for SQL Server


[via EXEC dbo.LongTermMemory__Archive]

Apparently SQL Server now has a new logo.

 

 

 

 

It's interesting... I think they felt left out at the launch events with Visual Studio 2008 and Windows Server 2008 when they were the only product without a logo.

I'm not quite sure what it's meant to be, but to my eye it seems to have been influenced a bit by the Kookaburra :)

kooka sql

What do you think this new logo is?

author: Darren Gosbell | posted @ Saturday, June 07, 2008 1:08 PM | Feedback (3)

We are hiring


My employer, James & Monroe are currently looking for people with strong skills in the Microsoft BI technologies. We are specifically looking for people to work at the Senior Consultant level that have experience with the SQL Server 2005 BI technologies in addition to experience with .Net programming. There is the likelihood of working with PerformancePoint so any experience in that would be advantageous.  The role would be based in the Melbourne area so you would either need to live in Melbourne or consider moving here. If you are interested and would like to find out more, drop me a note via my contact page. If you are in the market for a job I'm sure that you will find the package and the conditions very attractive.

author: Darren Gosbell | posted @ Friday, May 30, 2008 4:37 PM | Feedback (2)

What's New in SQL Server 2008 BI - Melbourne SQL Server User Group - May 20


If you are on the mailing list for the Melbourne SQL Server User Group you will already be aware of this, but I am doing a talk on Tuesday night on the new BI features in SQL Server 2008. You can find the details here:

http://www.sqlserver.org.au/events/ViewEvent.aspx?EventId=332

If you are going to be in town feel free to drop by and say hello.

author: Darren Gosbell | posted @ Saturday, May 17, 2008 2:11 PM | Feedback (0)

SSAS: Reporting on Metadata


I had a comment recently on one of my older posts that I did about XMLA which asked about listing cubes in a database and whether the cube is processed and it's size.

I have posted about a number of different ways of doing this over the last few years, but I thought I would use this opportunity to consolidate a list all the various ways of doing this that I could think of. Under the covers all these techniques are ultimately issuing some sort of XMLA discover against the SSAS database and returning a result, it's just that they all use different levels and types abstractions.

  • Using XMLA Discover 
    The XMLA discover command returns the results we want, but being an XML result it is not the most user friendly thing to read.
  • Using VBScript
    Vidas has an example which produces nice output in it's own right, but not easy to incorporate into a report.
  • Using Powershell
    Using powerSSAS you can interactively navigate through your SSAS database and inspect objects and properties or you could write a script, but as with the VBScript example, you cannot really use a Powershell script as a data source for a report.
  • Using ASSP
    I built the Discover and DMV functions for the Analysis Services Stored Procedure project that allow you to execute discover commands and return the results as a data table
  • Using ASSP Reports
    This is really a subset of the point above, but using these stored procedures I built a sample report in Reporting Services that displays all the cubes and partitions and their processed status for a given database. I would loved to have incorporated this report into SSMS, but SSMS does not allow custom reports for Analysis Services and it does not allow add-ins like we have in BIDS (ie. BIDS Helper) so there is no supported way to add this functionality at the moment.
  • SSAS 2008 - DMVs
    In the 2008 version of SSAS it will have native DMV functionality which produces similar to the ASSP stored procedures.

 

author: Darren Gosbell | posted @ Tuesday, May 06, 2008 10:08 AM | Feedback (2)

powerSSAS: Listing Role information


After my last post on how to list the aggregations for a given attribute using Powershell and PowerSSAS, miltruenos commented, asked if it was possible to do a similar script to show roles and allowed/denied sets, so here is just such a script.

add-PSSnapin powerSSAS
new-PSDrive
ssas powerssas localhost

$roles = gi "\Databases\Adventure Works DW\"  `

   | % {$_.Dimensions} `
   | % {$_
.DimensionPermissions} `
   | % {$_
.AttributePermissions} `
   | add-Member ScriptProperty DimensionName {$this.Parent.Parent.Name}-passthru
`
   | add-Member ScriptProperty RoleName {$this.Parent.Role}-passthru


$roles |sort-Object RoleName '
  
|Format-list DimensionName, Attribute, AllowedSet, DeniedSet -groupby
RoleName

However I realise that not everyone may be able to load PowerSSAS on their machines. So I thought I might also show how you could do the same thing with "pure" PowerShell. You can see that the core of the script is essentially the same, powerSSAS is really just a thin wrapper over AMO. The main difference is at the top where I have to load the AMO library and connect to the server and get a reference to the database.

$svrName = "localhost"
$DBname = "Adventure Works DW"
### load the AMO library (redirect to null to 'eat' the output from assembly loading process)
[System.Reflection.Assembly]::LoadwithpartialName("Microsoft.AnalysisServices") > $null
# connect to the AS Server
$svr = New-Object Microsoft.AnalysisServices.Server
$svr.Connect($svrName)
# get a reference to the database
$db= $svr.Databases.Item($DBname)

$roles = $db | % {$_.Dimensions} `
   | % {$_.DimensionPermissions} `
   | % {$_.AttributePermissions} `
   | add-Member ScriptProperty DimensionName {$this.Parent.Parent.Name} -passthru `
   | add-Member ScriptProperty RoleName {$this.Parent.Role} -passthru
$roles |sort-Object RoleName '
  
|Format-list DimensionName, Attribute, AllowedSet, DeniedSet -groupby
RoleName
$svr.disconnect()
 

I tried to find a way to make the format-list command put a break between each object, but I could not see a way of doing it. If you prefer you could replace the format-list with format-table and add the -wrap parameter, but I think that makes the allowed and denied sets a bit harder to read.

Note: Last year I added a report to the Analysis Services Stored Procedure project which also shows this sort of information. I think it still might be a bit rough, but it does give some idea of what is possible.

Technorati Tags: ,

author: Darren Gosbell | posted @ Thursday, May 01, 2008 10:29 PM | Feedback (2)

powerSSAS: Getting Aggregations for a particular Attribute


If you have ever manually edited aggregation designs, you may have wondered what aggregation currently exist for a particular attribute. Well the following powerSSAS script will give you just that. (you could do this with straight PowerShell, but powerSSAS just makes it slightly easier to address a given measure group)

Technically this script is just one single statement, with a couple of parameters to make it more re-usable. I have broken it up in order to make more readable by using the PowerShell line continuation character which is the back tick (`). I also pretty much developed it, starting off at the top and slowly drilling down adding one "line" at a time.

Before I (try to) explain what is going on here I thought I should explain some of the PowerShell notations that this script uses.

| pipes the objects output from the previous command into the next command
% shorthand for "for each"
{ } this is a script block, when it comes after % the script block is executed once for each object in the collection that was passed in.
; command separator
$_ denotes the current object
-eq does an equality comparison, in powershell the = sign is only used for assigning values

So here is the script:

1
2

3
4

5
6


7
8
9
10
11
12
13
14
15
16
17
18
19
20

add-PSSnapin powerssas
new-PSDrive ssas powerssas localhost

function getAggsForAttrib ([String]$MeasureGroupPath, [String]$Attribute)
{

(get-Item $MeasureGroupPath).AggregationDesigns `
    | % {  $_.Aggregations } `
    | % {  $agg = $_ ; $agg} `
    | % { $_.Dimensions} `
    | % {$_.Attributes} `
    | % {$_.Attribute} `
    | Where-Object {$_.Name -eq $Attribute} `
    | %{$agg} `
    | % { $_.Dimensions} `
    | % {  $curDim = $_ ; $curDim} `
    | % {$_.Attributes} `
    | % {$_.Attribute} `
    | add-Member ScriptProperty AggregationName {$agg.Name } -passthru `
    | add-Member scriptProperty CubeDimension {$curDim.CubeDimension} -passthru `
    | Format-Table AggregationName, CubeDimension, name
}  

Now, I'm sort of conscious that most of the people that are reading this will more more into Analysis Services than PowerShell. So for those of you that are interested, below is a rough outline of what is going on in this function. If you are just interested in the output, you can skip ahead to see what the output looks like.

lines 1 & 2 - these load powerSSAS and setup a connection to the localhost, if you are working with a remote instance you would just need to replace localhost with the name of the instance.

lines 3,4 & 20 - this is the function declaration

line 5 - This is where we get the Aggregation design for the specified Measure Group

line 6 - this can be translated into English as "for each AggregationDesign object that is piped in, echo out the Aggregations collection"

line 7 - for each aggregation in the Aggregations collection that was passed in, store the value in a variable called $agg (created on the fly) and echo out the contents of that variable.

lines 8-10 - for each Dimension in the Aggregation that was passed in get the Attributes collection and the individual Attributes

line 11 - filter all the Attribute objects so that we only return those where the name is the same as the $Attribute parameter

line 12 - echo out the $agg variable that was associated with the attributes that were filtered out in line 11.

lines 13-14 - grab the dimensions from the filtered aggregations and stored them in the $curDim variable and echo the contents of that variable to the next step in the pipeline.

lines 15-16 - output the set of other Attributes that are part of the aggregation design

lines 17-18 - to the Attributes which we are outputting from the previous step add a couple of dynamic member properties, one for the name of the aggregation and another for the name of the dimension.

line 19 - format the output as a table, only displaying the selected properties.    

And here is what happens when you ask the function for aggregations for the Internet Sales measure group in the Adventure Works DW database that include the Sales Territory Country attribute.


PS> getAggsForAttrib "ssas:\databases\Adventure works dw\cubes\adventure works\measuregroups\internet sales" "Sales Territory Country"

AggregationName          CubeDimension          Name                                  
---------------          -------------          ----                                  
Aggregation 8            Promotion              Promotion Category                    
Aggregation 8            Sales Territory        Sales Territory Country               
Aggregation d            Sales Territory        Sales Territory Country               
Aggregation d            Product                Days to Manufacture                   
Aggregation e            Sales Territory        Sales Territory Country               
Aggregation e            Product                Product Line                          
Aggregation f            Sales Territory        Sales Territory Country               
Aggregation f            Date                   Fiscal Year                           
Aggregation 10           Sales Territory        Sales Territory Country               
Aggregation 10           Date                   Calendar Year                         
Aggregation 11           Sales Territory        Sales Territory Country               
Aggregation 11           Ship Date              Fiscal Year                           
Aggregation 12           Sales Territory        Sales Territory Country               
Aggregation 12           Ship Date              Calendar Year                         
Aggregation 13           Sales Territory        Sales Territory Country               
Aggregation 13           Delivery Date          Fiscal Year                           
Aggregation 14           Sales Territory        Sales Territory Country               
Aggregation 14           Delivery Date          Calendar Year                         
Aggregation 15           Sales Territory        Sales Territory Country               
Aggregation 15           Product                Category  
           

And here is what happens when you ask the function for aggregations for the Internet Sales measure group in the Adventure Works DW database that include the Calendar Semester attribute. Note that the Date dimension is used a couple of times in the Adventure Works cube as a role playing dimension (Date, Ship Date, Delivery Date)

PS> getAggsForAttrib "ssas:\databases\Adventure works dw\cubes\adventure works\measuregroups\internet sales" "Calendar Semester"

AggregationName          CubeDimension          Name                                  
---------------          -------------          ----                                  
Aggregation 2            Promotion              Promotion Category                    
Aggregation 2            Delivery Date          Calendar Semester                     
Aggregation 4            Promotion              Promotion Category                    
Aggregation 4            Ship Date              Calendar Semester                     
Aggregation 7            Promotion              Promotion Category                    
Aggregation 7            Date                   Calendar Semester
 


Technorati Tags: ,

author: Darren Gosbell | posted @ Sunday, April 27, 2008 10:46 PM | Feedback (1)

More BI MVP goodness


I just learned that we have some new BI MVPs that were awarded recently

On the SSAS front Vidas Matelis (of www.ssas-info.com fame) has received a SQL Server MVP award.

And two of my fellow countrymen and PerformancePoint specialists Adrian Downes and Nick Barclay have both been awarded too.

author: Darren Gosbell | posted @ Wednesday, April 02, 2008 9:36 AM | Feedback (0)

Using PowerShell to update the case of Attribute names


I had a question recently about how to quickly convert all the attributes in a given database from UPPER CASE to Title Case. Now you could certainly write a C# or VB.Net based program, but I feel that a script is the way to go for a once off requirement like this and what better scripting environment could we ask for than PowerShell. So here is a short PowerShell script that does the job.

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices") > $null
[Microsoft.AnalysisServices.Server]$svr = new-Object([Microsoft.AnalysisServices.Server])
$svr.Connect("Localhost")
$DatabaseID = "Adventure Works DW"
$db = $svr.Databases.Item($DatabaseID)

# This small function is primarily extracted to improve readability
function ToProperCase([String]$in)
{
[System.Threading.Thread]::CurrentThread.CurrentCulture.TextInfo.ToTitleCase($in.ToLower())
( Get-Culture ).TextInfo.ToTitleCase($in.ToLower())
} # Foreach dimension, loop through each attribute and call the ToProperCase function $db.Dimensions | % {$_.Attributes | % {$_.Name = ToProperCase $_.Name}; $_.Update()}
# Print out all the Attributes for each dimension
$db.Dimensions | % {"Dimension: " + $_.Name; $_.Attributes | % {"   " + $_.Name }}

$svr.Disconnect()

The key to the whole routine is the following line, which probably looks a bit cryptic at first.

$db.Dimensions| % {$_.Attributes| % {$_.Name = ToProperCase $_.Name}; $_.Update()}

There are 4 PowerShell features in operation here
|  - the pipe character, which passes the output of the previous command as input to the next one
%  - the foreach operator which iterates over all the objects in a collection
$_ - the "current object" variable which returns the current object during each iteration of the foreach loop
;  - is the statement terminator

So in English the line of PowerShell above reads as follows: "Get the collection of dimensions and pass it to a for-each loop. For each dimension get the collection of Attributes and pass it to a for-each loop. For each Attribute, set the Name property equal to the Proper Case version of the Name. After processing all the attributes call the Update() method of the dimension."

In C# the single line of PowerShell would look like the follow:

foreach (Microsoft.AnalysisServices.Dimension dim in db.Dimensions)
{
  foreach (Microsoft.AnalysisServices.Attribute att in dbdim.Attributes)
    {
      att.Name = ToProperCase(att.Name);
    }
    dim.Update();
}

It's not hard to modify the main line to alter the name of all the dimensions in the database by using something like the following:

$db.Dimensions | % {$_.Name = ToProperCase $_.Name; $_.Update()}

Changing all the measure names can be done with the same technique, but I leave that as a exercise for the reader.

Update 17 Mar 08: Thanks to /\/\o\/\/ for a much simpler way to get the current culture.
Update 26 Mar 08: Corrected a slight typo in the C# translation (thanks Richard)

Technorati Tags: ,

author: Darren Gosbell | posted @ Monday, March 17, 2008 12:01 AM | Feedback (3)

Analysis Services Team Update posting on the MSDN forum


I just spotted an interesting post on the Analysis Services forum. It was titled "Analysis Services Team Update" and was posted by Ariel Netz, Group Program Manager for Analysis Services.

He starts off with ..

"I could never understand people’s fascination with blogs."

...which just begged to be blogged about. :)

In it he talks about how Analysis Services is looking for the SQL Server 2008 "Katmai" release

"In all honesty, things are looking good. In fact, looking very good (relative to where we are in the release cycle), so much so that it makes me somewhat nervous…  "

And he goes on to talk about how CTP6, which is also know as the February CTP is "feature complete" and that they are pretty much in a stabilizing phase now leading up to the release.

He also goes on to talk about how important it is to log any bugs on the connect site http://connect.microsoft.com/sql as bugs reported here are given much more weight by the team than one which was only found by the internal test teams.

It's an interesting read - you can read the full post here: http://forums.microsoft.com/msdn/ShowPost.aspx?siteid=1&PostID=2987119

Technorati Tags:

author: Darren Gosbell | posted @ Wednesday, March 12, 2008 9:03 PM | Feedback (0)

SSAS 2008 - small DMV improvement


I was just checking the DMVs in SSAS 2008 CTP6 to see if they had changed between CPT5 & 6. Particularly in regard to the list of limitations that Vidas posted. As far as I can tell the only thing that appears to have changed is that "SELECT DISTINCT" now appears to work.

Technorati Tags: ,

author: Darren Gosbell | posted @ Friday, February 22, 2008 9:21 AM | Feedback (0)

SSAS 2008: Displaying Hierarchical data from DMVs


I just noticed an interesting thing about the schema rowsets when queried using the new DMV syntax and that is that you can drill into hierarchical data - cool.

image4_thumb1

This probably comes out of building the DMV syntax on top of DMX which seems to make a bit of use of nested tables.

author: Darren Gosbell | posted @ Friday, February 22, 2008 7:29 AM | Feedback (0)