Friday, February 29, 2008

Expressions and Precedence Constraints

There was an interesting post on the SSIS Forums on MSDN earlier today. It went something (ok, exactly) like this:

I have a package that runs.  Inside the package I want to see if a specific table exists.  If it does, I go to the next step inside the package.  If it does not, I want to exit that package without errors or even warnings.
Any ideas?

What a great question! This is relatively common problem, but although the solution is quite simple, it can be far from obvious to people who have not spent a lot of time working with SSIS, and working with SSIS expressions and variables in particular.[1]

So how do we solve this problem? Simply! Here's how:

1) Create a variable to store a flag to track whether the table in which we're interested exists.

01 - Variable [2]

2) Use an Execute SQL task to query the SQL Server metadata to see if the table does exist, and store the result in this variable. If you're using SQL Server 2005 or later, this query will work. If not, you'll have to do a little additional research to find the right query for your environment.

          WHEN EXISTS (SELECT table_name
                         FROM INFORMATION_SCHEMA.TABLES
                        WHERE TABLE_NAME = 'Foo') THEN
       END AS TableExists;

Your Execute SQL task should look something like this, to store the return value from the query in the TableExists variable.

02 - General

03 - Result Set

3) Edit the properties of the precedence constraint that connects the Execute SQL task with the next task (the one that does the rest of the work) to base it on an expression that uses the variable (which has now been set by the Execute SQL task above) so that execution passes on to the next task only if the "table exists" flag is set.

04 - Expression

4) That's it! When you're done, your package should look something like this:

05 - Completed [3]

Now, when you execute your package, only the Execute SQL task should run, and then (because there is no valid precedence constraint for the package execution to follow) the package will exit without an error or warning, as desired.

06 - Does not exist

Conversely, if you happen to actually have a table named Foo in your database, execution will continue on, also as desired.

07 - Exists

Pretty cool and pretty simple, right? One variable + one expression == one simple approach to conditional package execution.

Expressions are probably the single-most powerful and important tool in all of SSIS. Although they are not the only tool, and although they are not the right solution to every problem, they apply to almost every situation where packages must be made dynamic.

This technique can also be used in scores of different scenarios, not just conditionally exiting package execution. I'll post more on this topic some day, but for now this will have to do. Not only do I have more writing to do, I also need to sleep at some point this week. Really...


[1] Sound familiar?

[2] Please note that I'm using a String variable and not a Boolean variable simply because it's late and I can't remember how to map an SSIS boolean to T-SQL. I know you can do it, but I'll leave that one as an exercise for the reader this time...

[3] I've set the ShowAnnotations property of the precedence constraint to ConstraintOption, so if you'd like your package to be self-documenting by displaying the expression, you should do the same thing.

Good Times, Bad Times

You know SQL Server 2008 has its share...

First, the bad news - Microsoft has made the following statement related to a bug in pre-release builds of SQL Server 2008 that prevent the SQL Server service from starting (or being installed!) on February 29th:

We have recently discovered an issue with SQL Server 2008 CTPs that result in SQL Server 2008 not starting or installing on Feb 29 GMT only. We recommend that you do not run, install or upgrade this CTP on Feb 29 GMT to minimize any impact in your environment. You can install starting on March 1 GMT. If you have an immediate issue that cannot wait until march 1st GMT contact before taking any further steps.

Ugh. Talk about bad timing. The official launch for the product was two days ago, so it's likely that quite a few people are attempting to install and use SQL Server 2008 for the first time today.

Still, it could be worse, right? Imagine the chaos in Los Angeles if the launch were today and all of the demos that depend on SQL Server 2008 were blowing up in front of a live studio audience. I shudder (and yet I also laugh at the same time - go figure) to think of that possibility.

And the good news? Microsoft and Unisys have announced new, world-record ETL performance using SQL Server Integration Services 2008. The bottom line is that they've loaded 1.18 TB worth of flat file data in 1794 seconds - just under half an hour. And yes, that's correct - TB and not GB. This would average out to over 2 TB worth of data per hour.


I won't try to reproduce all of the details here - instead, check it out on the SQL Server Performance blog here:

If you ask me, the good news far outweighs the bad. The bug only matters today and will be fixed before RTM. The amazing performance improvements in SSIS, SQL Server and Windows Server will last a lifetime.

My Inspiration

Believe it or not, one of the questions I was asked quite a few times yesterday in Los Angeles was "Which Manowar album should I listen to first?"

No, I'm not making this up.

As part of the "hero" nomination related to the Heroes happen {Here} launch event, I was asked what was my inspiration - where did I get the strength and motivation to push myself to excel?

The answer, of course, was Manowar. This heavy metal band has been around since 1980, and have recorded some of the most powerful and inspirational music I've ever heard. Many of their songs include strong messages of personal empowerment - never give up, always demand the best from yourself, let no one stand between you and your goals no matter what happens.[1] Because Manowar (both the band and their music) have made such a big difference in my life, I wanted to do what I could to share that passion with the world[2], so in the photos that you'll see around the launch event I'm wearing my Manowar "Sign of the Hammer" t-shirt. And quite a few people noticed that and came up to me to ask me questions.

"Are you serious?" Yes.

"Are they really that good?" No - they're much better.

"What album should I listen to first?" Kings of Metal.[3]

Manowar's 1988 album Kings of Metal is my personal favorite album, and it features many of their best songs, including Kingdom Come, Heart of Steel and The Crown and the Ring. If you're going to buy only one Manowar album, this is the one to get.

Unfortunately, the current version of this album contains a bonus track that (in my humble opinion) should never have been released. It is a somewhat satirical take on a classic science fiction novel, but it comes across to me as very negative and misogynistic, and to me it ruins the rest of the album. Fortunately, you can purchase DRM-free MP3 versions of Manowar's albums from their online store, and you can skip the bonus track if you want to.

In any event, Manowar's music has made a distinct and profound difference on my life, inspiring me to always be better today than I was yesterday. If you're open-minded enough to try something new, I strongly encourage you to get Kings of Metal (or any other Manowar album - maybe all of them!) and crank it up the next time you sit down to write some code. And when you do - let me know what you think.


[1] Of course, there are also many themes of warriors and battles and more physical struggles, with Viking imagery in many songs throughout their long career. Often these themes represent the metaphorical struggle to fight against the demons within and the demons without, but sometimes they're just great powerful heavy metal. And sometimes they're both. ;-)

[2] Just like I try to share my passion for SQL Server, BI and SSIS here, just a lot louder.

[3] My wife (the other source of inspiration in my life ;-) would argue with me here. She very much prefers Manowar's latest studio release, the 2007 album Gods of War. Gods of War represents something of a change in Manowar's sound, with a much more epic and orchestral feel. It's definitely a great album, and if pounding drums and screaming guitar aren't your cup of tea, you may want to get it before Kings of Metal, but I stand by my first recommendation.

My Hero!

The big Heroes Happen {Here} launch event is over. I can't believe what a great time I had yesterday (well, yesterday compared to when I wrote this, but not compared to when I'll be able to post it, I'm sure) in Los Angeles. The event itself was like a mini-conference. There was a keynote address from Steve B. (along with an introductory presentation from Tom Brokaw, which was a pretty big surprise) plus three or four tracks worth of breakout sessions, chalk talks, hands-on labs, expo halls for both Microsoft and event sponsors and more - it was not unlike TechEd condensed down to one day with only 200-level content.

Normally at events like this I don't get to go to many sessions; I'm usually either speaking, or working in the hands-on lab area, or performing some other non-attendee role, but yesterday I could basically do whatever I wanted, which was awfully nice.

But the best thing about being one of the "heroes" for the launch event was being able to take one of my heroes with me - my mother.

My mother has been curious (probably for much longer than I've realized) about just what the heck it is that I do. As you can probably imagine, it's often difficult to explain software development, business intelligence and SSIS to a relatively non-technical person. And the fact that in addition to doing this "real work" I also do training and writing and speaking and all that, explaining my work life just gets more complicated.

But my mother has done so many things for me over the years. Not only did she bring me into the world in the first place[1] but she also taught me that I could always do whatever I wanted to do; all I needed to do was to set my mind to it. I owe so much to my mother that words don't do it justice.

And hopefully now she at least has a decent idea of what it is that I do for a living. From one perspective, she got to see the tools I use and the problems that they solve. We attended together a breakout session on SQL Server 2008 business intelligence presented by Tom Casey, with Donald Farmer doing the demonstrations. It was a great session, covering SSAS, SSIS and SSRS, plus a few database engine features related to BI.[2] There wasn't a heck of a lot of technical detail in the session, but that was probably a good thing. We got to see the tools, hear their purpose described, and have them placed into a context that explained why we should care.

From another perspective, my mother also got to see the type of event at which I work and speak. She got to see some very good presenters (Tom and Donald are quite good at what they do) as well as some less good presenters (who shall of course remain unnamed) and we got to talk about what makes the difference between the two.[3]

Best of all, we got to meet many of the people with whom I have worked at various Microsoft shows over the years. Lynn, Karen, Beth, Kim, Kyle, Gordo, Joey - you guys all rock. I talk about these people back at home, but until now I've never been able to introduce these two sides of my world to each other, and it was a great experience for me to be able to do so.

So we'll soon be home, and my mother and I will each have to get back to the mundane details of our usual lives. Hopefully she's come away from this brief trip with a little more understanding of just what it is that she has empowered me to do through her support throughout my life.

And for you reading this - if anyone made it to the end - please ask yourself when was the last time that you did something special for your mother. Odds are it has been too long, hasn't it?


[1] And yes, she can take me back out of it, but she doesn't make a big deal of that fact.

[2] Tom and Donald went out of their way to make her feel at home as well - thanks so much, guys!

[3] I personally believe that there are three required elements for a great technical presenter. First, the presenter really needs to understand the technology - if you don't know your stuff, then you should not be on the stage. Second, the presenter needs to be excited and truly passionate about the material being presented - if you're not passionate, how can you excite and motivate your audience? Third, the presenter must be able to effectively communicate both the technical detail and the passion, placing the information in the context of the audience, so that the audience members understand not just the what, but also the why, and why it matters to them. Sadly (or perhaps not so sadly, because this means I get to speak at more conferences ;-) there are few people out there that bring these three things together, but fortunately we got to see some of them in Los Angeles.

Tuesday, February 26, 2008

Los Angeles, Here I Come!

As you probably know, tomorrow is the date of the big Heroes Happen {Here} Launch Event in Los Angeles, California. Microsoft is "launching"[1] SQL Server 2008, Visual Studio 2008 and Windows Server 2008 in what (according to Microsoft PR, anyway) is their largest product launch ever. Not only is there the main event in LA, but there are hundreds of local and regional events scheduled around the world in the weeks and months ahead.

And I'll be there, sitting up front.

As the name implies, Microsoft has a "Hero" theme for this launch wave - they're focusing on the people who use Microsoft technologies to make a difference in the world. People who are on the cutting edge and loving it.

People like me! ;-)

That's right - Microsoft is featuring yours truly as one of the heroes of the launch wave, so you should keep your eyes open for your favorite SSIS blogger at whatever launch event you visit. If you're going to be at the LA event look for me in person, and if not, look for a handsome young man[2] wearing a stupid grin and a Manowar t-shirt. And if you do see me, make sure you say hi!


[1] Note that this is "launching" and not "shipping" - SQL Server 2008 is still some months away, I'm afraid.

[2] Yes, I'm really that delusional.

Thursday, February 21, 2008

Sorting and Metadata

A recent post to the SSIS Forums on MSDN made me realize how un-intuitive it can sometimes be to get sorted data in an SSIS data flow. Let's review the obvious facts:

  • When you query data from a relational database like SQL Server, the OLE DB source component gets metadata from the database server based on the SELECT statement.
  • This metadata includes things like column names, data types and so on.
  • The SSIS data flow designer uses this metadata to build the data flow pipeline.
  • The SQL SELECT statement includes an ORDER BY clause which specifies the sort order for the data to be returned.
  • This sort order is not provided by the database server, so the SSIS data flow has no way to tell if the data is sorted or not.

Hey, wait! That last fact may not be so obvious unless you think about how the database server is presenting this metadata to the SSIS tools. Essentially the OLE DB source component is sending the SELECT statement to the server, with some modifications to limit the number of rows being returned. The server returns the rows along with metadata that describes them. If the database is SQL Server, this data and metadata will be returned in a Tabular Data Stream (TDS) protocol stream - this is the protocol that SQL Server uses, so this is what SSIS gets back.

But if you've ever looked at the TDS spec, you know that TDS doesn't have any concept of sort order, so there's no way that SSIS can get the sort order from SQL Server.

So how does SSIS know that the data is sorted, and by what columns?

It knows because you tell it. And it trusts you implicitly[1] so you need to be careful to be honest.

So how do you do it?

Consider this SELECT statement:

  SELECT [AddressID]
    FROM [Person].[Address]
ORDER BY [PostalCode]
        ,[ModifiedDate] DESC

So how would you tell the SSIS data flow how this data is sorted?

There are two things you need to do, both of them in the Advanced Editor for the OLE DB source component. First, set the IsSorted property of the OLE DB Source Output to True. This essentially tells SSIS that the data will be sorted, but not how it will be sorted.

01 - IsSorted

Next, set the SortKeyPosition property for the PostalCode and ModifiedDate columns in the Output Columns collection. Set SortKeyPosition to 1 for PostalCode because this is the first column in the ORDER BY clause. Set SortKeyPosition to -2 for ModifiedDate because this is the second column in the ORDER BY clause, and the column is marked as DESC - this is why it's -2 and not 2.

02 - SortKey 1 

03 - SortKey 2

Now, when this package is executed, not only will the data be sorted (because we added an ORDER BY clause to our source query) but SSIS will know that the data is sorted as well, because we told it that it was. Now any downstream components (such as a Merge or Merge Join transformation) that require sorted inputs will be able to do what they need to do.

Life is good, because SSIS loves you.


[1] SSIS trusts you because SSIS loves you. More than you know.

Wednesday, February 20, 2008

Dynamic Flat File Destinations

A recent post on the SSIS forums on MSDN has inspired me to finally post my first technical blog post of the year. Here's the basic scenario:

  • A source system has multiple departments
  • For each department there are multiple employees
  • The SSIS package must extract all employees from all departments and load the employees from each department into a department-specific text file

For example, if there are Sales, Management and IT departments, the package should create sales.txt, management.txt and it.txt text files with the appropriate records in each file. Should be pretty simple, right?


Well, maybe.

The issue at hand is not that this sort of thing is difficult or complicated, but that unless you've spent a decent amount of time working with SSIS - and SSIS expressions and variables in particular - it's not really obvious where to begin. So we, of course, shall begin at the beginning, setting up our data sources.[1]

First, let's create a one-table source system in SQL Server, populated with data. Here's a SQL script that defines the source system:

USE TempDb

   ID             INT            IDENTITY,
   FirstName      VARCHAR (50),
   Department     VARCHAR (50)

INSERT INTO SourceData VALUES ('Bob', 'Sales')
INSERT INTO SourceData VALUES ('Susie', 'Sales')
INSERT INTO SourceData VALUES ('Steve', 'Sales')
INSERT INTO SourceData VALUES ('Bill', 'Sales')
INSERT INTO SourceData VALUES ('Ken', 'Sales')
INSERT INTO SourceData VALUES ('Ted', 'Sales')

INSERT INTO SourceData VALUES ('Darren', 'IT')
INSERT INTO SourceData VALUES ('John', 'IT')
INSERT INTO SourceData VALUES ('Jamie', 'IT')
INSERT INTO SourceData VALUES ('Chuck', 'IT')
INSERT INTO SourceData VALUES ('Rafael', 'IT')
INSERT INTO SourceData VALUES ('Larry', 'IT')

INSERT INTO SourceData VALUES ('Lutz', 'Management')

INSERT INTO SourceData VALUES ('Ken', 'Management')
INSERT INTO SourceData VALUES ('Bill', 'Management')
INSERT INTO SourceData VALUES ('Mike', 'Management')
INSERT INTO SourceData VALUES ('Chris', 'Management')

Pretty simple so far, right? Right!

Next, let's create a sample text file that represents our destination files. This will make it much easier to build the SSIS package, because as we all know, SSIS thrives on metadata. Here's the sample text file:


Again, very simple. Now let's build the SSIS package. We'll start by creating a new package in Visual Studio and defining two connection managers, like so:

01 - Connection Managers

The OLE DB connection manager is very straightforward - it just references the local tempdb database where the source data is stored. The Flat File connection manager is a little more interesting in that we've customized it just a little bit to say that the column names are in the first row, and that the ID column is a 4-byte integer.

02 - Flat File Connection

Next, we need to create a few package variables to make everything else possible:

03 - Variables

The first variable, CurrentDepartment, exists to store the current department we're loading from the source system. It will get populated by a Foreach Loop container once we start building the package logic.

The second variable, DepartmentCollection, exists to store the whole list of departments we're going to pull from the source system with an Execute SQL task.

The third variable, SqlSelectScript, exists to store the SELECT statement that will extract the employees for the current department from the source system. The fact that it has to be for the current department is what makes it interesting, and to solve that problem we need to use an SSIS expression. We set the SqlSelectScript variable's EvaluateAsExpression property to True and then set its Expression property to this expression:

"SELECT ID,FirstName FROM SourceData WHERE Department = '" + @[User::CurrentDepartment] + "'"

As you can see, the expression evaluates to a valid SQL SELECT statement, and its value will always reflect the current department from the CurrentDepartment variable.

04 - SQL Expression

Now that we have all of our variables, we also want to update the Flat File connection manager with an expression as well, so that the name of the file will be based on the name of the current department. Let's add an expression to the connection manager's expressions collection to base its ConnectionString property on this expression:

"C:\\Projects2005\\SSIS.BlogFodder\\SSIS.BlogFodder\\" + @[User::CurrentDepartment]  + ".txt"

Obviously you should use whatever folder path makes sense for you, but make sure that you use a double backslash for any backslash characters in your path - this is necessary for the expression to be properly evaluated.

05 - Flat File Conenction Expression 

Finally, we're ready to start building the package's actual control flow and data flow. The first thing we need is an Execute SQL task that will run a SELECT statement to get a list of distinct departments and store that list in the DepartmentCollection variable. The SELECT statement looks like this:

SELECT DISTINCT Department FROM SourceData

And the Execute SQL task looks like this:

06 - Execute SQL General

07 - Execute SQL Result Set

The main things to notice are that we're specifying Full Result Set for the result, and we're storing it in the DepartmentCollection variable that we created earlier on - and remember, we created the DepartmentCollection variable with the Object data type, so we can store the whole department list in a single Recordset.

Next, let's add a Foreach Loop container to the package's control flow, and connect it to the Execute SQL task with a precedence constraint. Let's configure the Foreach Loop so that it will loop over each department added to the DepartmentCollection variable, and will store the current department from the DepartmentCollection variable in the CurrentDepartment variable, like so:

08 - Foreach Collection

09 - Foreach Variable Mappings

And last but not least, let's add a Data Flow task to the Foreach Loop container, so that the control flow looks like this:

10 - Control Flow

And at this point, all of the hard work is done. The data flow is very simple, just mapping the fields from an OLE DB source component which uses the existing OLE DB connection manager, to the a Flat File destination component, which uses the existing Flat File connection manager. The astute reader will notice at this point that there is a little "dynamic magic" going on in this simple scenario. Because the Flat File connection manager is configured with an expression on its ConnectionString property, the data flow that uses it will automatically be dynamic, and will automatically load the data into the correct flat file for the department being extracted.

The one thing to remember in the data flow is that the OLE DB source component needs to get its query from the SqlSelectScript variable, which is also dynamic because we based the variable on an expression.

11 - OLE DB Source

With the source and destination connected, the super-simple data flow looks like this:

12 - Data Flow

And when we run the package, what happens? This is what happens:

  1. The Execute SQL task runs, loading the list of departments into the DepartmentCollection variable
  2. The data flow task executes once for each department, because it is contained within the Foreach Loop container, which is looping over the DepartmentCollection variable
  3. Each time the data flow task executes it is extracting only employees from the current department, because the source query is based on an expression
  4. Each time the data flow task executes it is loading data into a different department-specific text file, because the ConnectionString property of the Flat File connection manager is based on an expression

And it all looks like this:

13 - Complete

See how easy that was? It will probably take half as long to actually do this as it did to read this blog post. A few expressions, a decent understanding of the business requirements, and SSIS does all the hard work.


[1] At this point, my laptop crashed, and I lost all of my work. This is just a reminder to myself: even if it's not "real" project work, always save all of your work regularly. It's annoying to have to recreate a bunch of SQL scripts for a blog post because they "weren't important enough to save" in the first place...

Monday, February 18, 2008

Join Me In Orlando for TechEd: IT Professionals

Although you probably can't tell from the state of my blog (I don't think I have posted a truly technical post so far this year) I've been awfully busy lately, and it looks like 2008 is going to only get busier. How do I know this?

I know because I just got email confirmation that I've been accepted to deliver two SQL Server Integration Services sessions at TechEd 2008 US IT Professionals in Orlando this June.

I've been accepted to present these two sessions:

Microsoft SQL Server Integration Services Deployment Best Practices
So you've built a set of SSIS packages to populate your data warehouse, and everything works great on your development environment - but what next? SSIS has a great set of tools, but when it comes to preparing for and executing a seamless deployment from development into test and finally into production, it's not always obvious what tools to use or how to best use them. In this session you'll learn how to prepare for and execute a seamless deployment of complex ETL solutions through a repeatable, testable process for both SQL Server 2005 and SQL Server 2008. If you're tired of saying "but it worked on my machine!" then this is one session you can't afford to miss.

Moving Beyond Package Configurations: An End-to-End Approach for Custom Package Portability
SQL Server Integration Services includes Package Configurations – a powerful mechanism for implementing location independence in SSIS packages, and an integral part of successful SSIS deployments. But package configurations are not adequate to every SSIS deployment scenario, and unfortunately there is no mechanism to extend or customize their behavior – it’s all or nothing. This means that if package configurations don’t give you what you need, you need to build your own replacement from scratch. This session will present a complete end-to-end replacement for package configurations, implemented using the SSIS .NET API. This solution includes not only the core code to implement the configuration functionality but also a set of development and management utilities to ease deployment, testing and validation tasks that “just work” with package configurations but which must be replaced when using a custom solution. We will look at the design criteria that necessitated a move away from the built-in package configurations feature, the code used to implement the solution, focusing on the challenges presented by the SSIS API, and a real-world SSIS solution in which the code and tools presented have been used for large scale production deployments.

Sounds like fun, doesn't it?

Hopefully you'll be able to join me there. I had an amazing time presenting (especially my SSIS sessions!) at the MCT Summit conferences in Berlin and Redmond over the past month or so, and I know that these TechEd sessions will be at least as much fun - probably more.[1] If you're planning on being at the TechEd IT Pro conference, you should definitely make sure that you attend both of these sessions. And if you're not planning on attending - why not? There's no time like the present to start talking to your boss!

[1] And if I can deliver them without getting horribly ill that will be even better. I came home from the Redmond MCT Summit with the worst flu I've had in 10 years or more, and have been laid low for more than a week now. I'm over the worst of it, but I still feel like I've been run over by a truck or two...

Tuesday, February 5, 2008

SSIS Deep Dive at the MCT Summit in Redmond

I know that this is not a lot of notice, but if you're in Redmond for the MCT Summit event, I will be delivering a bonus SQL Server Integration Services "Deep Dive" session at the end of the day in Salon 3/4. This is the same room where my final scheduled session will be held, so if you're attending the "New Features in SQL Server 2008 for Database Developers" session, you'll already be in the correct room.

Please be warned that we'll probably overlap with the scheduled bowling trip (which really doesn't appeal to me) and the attendant open bar that Microsoft is going to provide (which does appeal) so there is a trade-off to be made. I'm more than happy to pass on the open bar (especially since each attendee at this bonus session will need to buy me a drink in payment ;-) but potential attendees should take this into account.

What's the agenda? It will (hopefully - I don't have any slides, so I may well forget) look something like this:
  • Package development best practices
  • Package deployment
  • Design patterns and suggestions
  • Real-world package demos and walkthroughs
  • Q&A - hopefully we'll have a TON of interaction, and the Q&A session will last a long time
Hopefully I'll see you there!

Monday, February 4, 2008

Two Down, One to Go

Microsoft today announced the release to manufacturing of Windows Server 2008[1], which means that of the three products being "launched" at the end of the month are actually done. Only SQL Server 2008 remains.

Of course, this news is all over the Internet already. And people don't read this blog for generic launch news. (I assume.) But I'm posting this news as an excuse to try out Windows Live Writer. Quite a few people have recommended this to me lately, and since I was setting up a new computer anyway, I figured I'd try it out.

And it seems to work very nicely. Maybe now I can blog on the plane without typing into a Word document and pasting it into a browser window at the hotel. Time will tell...


[1] Yes, and Windows Vista SP1 as well, but that's less exciting, I think.

Under the Line

I'm working this week with a brand new install of Windows Vista (which is another painful story which we won't get into today) and have been reminded of one of the things that drives me crazy about the Vista UI: The hot-keys for menus are hidden, so you can't tell what keyboard shortcuts to use until you press the Alt key.

And I can never find the place to turn this on. I have to search for it online in order to find this feature. It's not in the Display properties anymore, where it has been in the last n versions of Windows. Instead, it is buried in the "Ease of Access Center." To turn this on, you need to:
  • Open the Ease of Access Center from the start menu. (Use the built-in search)
  • Click on "Make the keyboard easier to use" even though this is what you're trying to do.
  • Type "Underline" in the search box in the upper right corner of the window.[1]
  • Click on the "Underline keyboard shortcuts and access keys" link.

No, this isn't really a technical or BI post, but I figure that if I'm struggling to find this, someone else probably is too. And even more importantly, the next time I build a clean Vista machine and can't remember to look in the Ease of Access Center, I can come here and find the instructions myself...

[1] The saddest thing is that I spend a good five minutes or more clicking through the Ease of Access Center window trying to find the actual path to this switch, and I could not find it. It's a good thing they built in search, because the features we need are often very well hidden in the UI. It wasn't until I used search to find this option that I could locate the page where it can be found.

Buy Me a Drink and Watch Me Dance!

No, I have neither lost my mind[1] nor changed careers. Instead, I'm planning a "bonus session" on SQL Server Integration Services for this week here at the MCT Summit in Redmond. I just spoke with a fellow SQL Server MCT (Rick, who had commented on an earlier blog post a few days back - hi Rick!) who let me know that although my "bonus session" this week is not going to be an SSIS deep dive, he's still interested in getting that content.

And I'm still interested in delivering it.

So... At some point this week (time and location TBD) I'm going to be delivering a deep SSIS technical session with any MCT who wants to attend. If you're at the summit and are reading this, spread the word and let me know what you want to hear. We'll find a room and make it happen.

And the cost? One Grey Goose and tonic, to be delivered after the session is complete. ;-)

[1] Quiet, Ted.