Damon Armstrong

Caffeine Induced Tirades about .NET and Life
And don't forget to check out my latest Simple-Talk articles
View Damon Armstrong's profile on LinkedIn      Add to Technorati Favorites      Add to Google     

  • Resolving the Access is Denied Error in VSeWSS Deployments

    Posted Thursday, February 04, 2010 1:01 PM | 0 Comments

    Visual Studio Extensions for Windows SharePoint Services 1.3 (VSeWSS 1.3) tends to make my life easier unless I'm typing out the words that make up the VSeWSS acronym - really, what a mouthful.  But one of the problems that I routinely encounter are error messages when trying to deploy solutions.  These normally look something like the following:

    Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

    I tried a variety of steps to resolve this issue:

    • Recycling the application pool
    • Restarting IIS
    • Closing Visual Studio
    • Not detaching from the debugger until a request was fully completed
    • Logging off and logging back into Windows
    • etc.

    Nothing actually worked.  Some of these resolution attempts seemed to help keep the problem from happening quite as frequently, but I still have no idea what EXACTLY causes the problem and it would rear its ugly head from time to time.  Unfortunately, the only resolution I found that seemed to work was to reboot the machine . which is a crappy resolution.

    Finally sick enough of the problem to spend some time on it, I went on a search and tried to figure out if anyone else was having this issue.  People seem to suggest that turning off the Indexing Service on your machine helps resolve this problem.  I tried turning it off but I kept having issues.  Which was depressing. 

    Fortunately, I stumbled upon the resolution when I was looking through the services list.  If you encounter the issue, all you have to do is reset the World Wide Web Publishing Service.  I've had a 100% success rate so far with this approach.  I'm not sure if having the Indexing Service is part of the solution, but I've kept it disabled for the time being because I'm really sick of having to reboot my machine to deal with that error message.

    If you do VSeWSS development, you may also want to check out this blog post:
    VSeWSS 1.3 - Getting around the "Unable to load one or more of the requested types" Error

  • TechFest Houston Slides and Source Code

    Posted Monday, September 28, 2009 11:32 AM | 0 Comments

    TechFest Houston was a blast, and if you came out to my presentation on Simpliyfing Web Part Development or dropped by the Cogent booth, then I would like to say thank you! The presentation slides and demo source code can be downloaded below.
  • .NET on the iPhone?

    Posted Friday, September 18, 2009 4:39 PM | 1 Comments

    Ty Anderson just shot me a link to MonoTouch (http://monotouch.net/), a product that allows you to develop IPhone software using Microsoft's .NET Framework.  You'll still need a Mac, the Apple iPhone SDK, and to be a member of the Apple iPhone Developer Program, but it's still pretty cool that it lets you use your current knowledge set to develop applications.  At least in theory.  Not sure how that works out in reality, but I'd be interested to see and hear if anyone has/is giving it a shot.

  • Access Denied for "User Profile and My Sites" Links in an SSP

    Posted Thursday, September 17, 2009 9:02 PM | 0 Comments

    SharePoint is great about hiding permissions.  I was working on a Shared Service Provider (SSP) and was greeted with an access denied page when I went to edit some of the profile settings under the "User Profile and My Sites" section.  I was a little disturbed because I am a site collection admin, and I have access via the Web Application Policy in Central Admin.  Fortunately, I found the following link:

    http://blog.tylerholmes.com/2008/09/access-denied-for-site-collection.html

    Tyler Holmes was nice enough to post his findings and provide a nice walkthrough on how to get around the issue.  Basically, it involves clicking on the permissions link at the bottom of the "User Profile and My Sites" section and giving yourself access.

  • VSeWSS 1.3 - Getting around the "Unable to load one or more of the requested types" Error

    Posted Monday, September 14, 2009 1:35 PM | 2 Comments

    I hate packaging SharePoint solutions by hand.  Once you've got it working, it's not a big deal, but it takes a lot of reading and remembering each time you start one anew.  VSeWSS is a nice tool that integrates with Visual Studio 2008 and builds out SharePoint solution files auto-magically.  However, it has its quirks.  Quirks that irk me to no end because it feels like it's a constant struggle to get it to do what you want. 

    I've got a templated web part base class that I use on a lot of SharePoint projects because it really helps separate out the UI from the business logic.  In the past, we've just copied the code from project to project.  In an attempt to avoid code strewn about all over the place, I decided to pull it back into a single assembly where it could be maintained more easily.  So, after a bunch of work, I went to package things up with VSeWSS and I received the following error:

    VSeWSS Service Error: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

    Wonderful.  A bit of digging revealed that this is an issue if you're web parts reference a base class in another assembly.  For real?  Seems like that's a pretty big issue since copying and pasting code from project to project is frowned upon in terms of maintainability. 

    Then I used all of my mental devices and .NET knowledge to create a plan so cunning that it would circumnavigate the issue entirely.  Make an dummy class in the project that inherits from my base class in the assembly.  As such, the base class would be in the project itself where VSeWSS could see it, but the REAL code would be in the external assembly.  Shear genius!

    Yeah, that didn't work.  Apparently you can't have a base class ANYWHERE in the inheritance chain.  That left me with a big WTF moment.  I was seriously miffed that this would not work.  If you look into the error that VSeWSS throws, you'll see it's a reflection error.  So I hashed together my next, slightly less cunning, plan:  throw copies of my assembly everywhere and anywhere that VSeWSS could be looking in the hopes it would magically find it.  I ran the VSeWSS packager, and it packaged everything up without error.  So then it was a process of elimination as I removed the assembly from the various places I had placed it.  In the end, I found that in order for VSeWSS 1.3 to see your external base class, you need to copy your assembly to the following location:

    C:\Program Files\Microsoft SharePoint Developer Tools 9.0\svc\bin

    This appears to have worked for my scenario, though I'm not sure if such is always the case.  I was also really surprised that putting the assembly in the GAC seemed to have no effect. 

  • Speeding up Windows Virtual PC Performance (on Windows 7)

    Posted Monday, September 07, 2009 9:39 PM | 2 Comments

    I recently upgraded to Windows 7.0 and I have to say that I'm liking it and it's a heck of a lot better than Vista.  I can't really put my finger on it, it just seems easier to navigate through stuff and get to what I want.  But one of the things I found disappointing was the performance of Windows Virtual PC, which is currently in Release Candidate (as of this posting).  I've got a nice machine with a quad-core and 8 gigs of RAM, and VPCs in the past have been like working directly on another box.  But even with the RAM maxed out for a VPC, the VPC machine was running horribly slow.  I soldiered through working on a VPC for a night, and I think it took about 8 hours to do about 2 hours worth of work.

    In the end, I moved the VPC from my host drive (C:) to a USB 2.0 hard drive.  It was like day and night - the VPC was back to running at full speed.  I'm not sure why having the VPC image on your host drive is such an issue (it wasn't in Vista), but if you're having performance issues with VPC on Windows 7.0, I highly recommend moving the image.

  • Disable XML Comment Warnings for a File

    Posted Friday, September 04, 2009 4:54 PM | 0 Comments

    I'm a big fan of enabling XML comments when you're working on a project (either alone or as a team) because it helps you quickly identify what has and what has not been documented.  When you have XML comments enabled, the compiler will show warnings for any public and protected classes / class members that do not have XML comments.  To enable XML comments you just check the XML documentation file option in the build tab of the project properties page. 

    One of the issues that you run into, however, is that there can be a number of code generated files in your projects, and you have no control over that code.  But, if that file is no re-generated often, then you can insert a bit of code to suppress XML comment warnings from that file:

    // Disable all XML Comment warnings in this file //
    #pragma warning disable 1591

    The next time you compile, XML comment warnings from the file will not be display.  If you're wondering, the 1591 is the specific warning number for XML comments.  If you remove the XML comment warning number from the pragma statement, then all warnings from the file are suppressed, not just XML comment warnings.  no warnings will come from the file.  You can also tack on additional warning codes to suppress additional types of warnings, if desired.  How do you figure out what the numbers are?  I find one of the easiest ways to go about it is to read the output window (NOT the Error List window).  When a warning is generated, it normally looks something like the following:

    [filename]: warning CS1591: Missing XML comment for publicly visible type or member 'VSeWSS.TargetListAttribute'

    Notice there is a number right after the warning (in this case its CS1591)?  Just drop the alpha prefix and you've got your warning number.  Since this is in the output window, you may have to scroll through the text a bit to actually find the warning, but it should be in there somewhere.

  • Fixing the 'Name ActiveX Control' Message on SharePoint Sites

    Posted Thursday, September 03, 2009 10:49 PM | 0 Comments

    SharePoint sites normally have a 'Name ActiveX Control' used to communicate you're online presence back to the Office system.  If you've ever seen a site where it shows you who is 'online' and who is 'offline' then know that this is the mechanism that marks someone as being 'online'.  That is all fine and well for internal application, but it kinda sucks for public facing sites because users are asked to install some weird ActiveX control that they know nothing about.  I find it particularly odd that it's included on the default publishing site.  Whatever.  Fixing it should be relatively easy because there is a knowledge base article outlining what to do:

    Knowledge Base Article 931509

    Unfortunately, that only gives you part of the solution.  It basically tells you to comment out two function headers in the init.js file.  If you follow the instructions in the Knowledge Base article exactly, you'll see a little JavaScript error notification when you refresh the page.  Probably because, now, let me guess . you commented out a function header without commenting out the rest of the function?  Also note that one of the functions you commented out gets called later, which is a bit of a syntactical no-no in just about every language of which I can think.

    So, if you want to avoid the 'Name ActiveX Control' message on your SharePoint site AND have it work correctly (novel idea), you need to entirely comment out both functions, and comment out any references to those functions anywhere else in the JavaScript file.

  • Avoiding Local Authentication Issues with SharePoint Sites using Host Headers

    Posted Wednesday, September 02, 2009 5:12 PM | 0 Comments

    All of my VPCs are children from a base VPC that I happened to name Win2k3R2Base.  At the time, it seemed pretty reasonable because I was building a base VPC for Windows 2003 R2.  But when you're developing SharePoint web applications, it gets pretty tiring having to continually type a nasty machine name into URLs.  So I figured I would use a host header instead of the machine name to access the SharePoint site. 

    After setting up a site to use a host header, however, I ran into an issue authenticating to the site.  It kept prompting me for a login and, although I was typing the correct username and password, authentication always failed, giving me the standard:

    HTTP 401.1 - Unauthorized: Logon Failed

    I did a bunch of checking to make sure the host headers were setup correctly, the alternative access mappings were pointing to the right place, that the host name would resolve to the right IP address, but no matter what I did, I could not access the site from the local box.  Interestingly enough, I could access the box externally using the host header without any issues (after updating the other box's host file).  Naturally, this was a bit perturbing. 

    I figured there had to be a solution for this somewhere, so I began scouring the web looking for a solution.  After a bit of searching, I found the following Microsoft Knowledge Base (KB) article that outlines the problem:

    http://support.microsoft.com/default.aspx/kb/896861

    Basically, there was an update in Windows Server 2003 Service Pack 1 that adds a loopback check to help prevent reflection attacks on your computer.  Fortunately, there is a simple registry edit to avoid the loopback check on certain host names (the recommended approach) or a way to simply disable loopback checking altogether (not quite as a recommended).  Try one, and if it doesn't work, try the next.

  • Recursive Anonymous Methods

    Posted Tuesday, September 01, 2009 1:54 AM | 0 Comments

    I was having a lively discussion with a friend the other day on the finer points of anonymous methods and lambda expressions. Yes, at Cogent Company this is actually what we do for fun.  I had basically said that an anonymous method was just like any other method, to which he rattled off a laundry list of the differences.  One of those differences caught my attention:  you cannot create a recursive anonymous method.  At first glance it seems to make perfect sense - how can you call a method with no name.?  But when you think about it from a CLR perspective, how could you not be able to?  An anonymous method is basically like any other method, and if any other method can be called recursively then so can an anonymous method.

    So, here's the code for a recursive anonymous method that solves factorials:

    using System;
    using System.Reflection;

    namespace RecursiveAnonymous
    {
     
    class Program
      {
       
    delegate int FactorialDelegate(int i);

       
    static void Main(string[] args)
       
    {
          FactorialDelegate factMethod
    = x =>
           
    {
             
    return x 1 ? 1 : x * (int)MethodBase.GetCurrentMethod()
               
    .Invoke(null, new object[] { x - 1 });
           
    };
         
    for (int i = 0; i 10; i++)
         
    {
            Console.WriteLine
    (factMethod.Invoke(i));
         
    }
          Console.Read
    ();
       
    }
      }
    //class
    } //namespace

    The real trick is to use MethodBase.GetCurrentMethod(), which gets a reference to the MethodBase of the currently executing method (essentially the MethodInfo).  From there you can call the .Invoke method and pass in the appropriate parameters, allowing the anonymous method to execute again (recursively).  Hooray for reflection.

    I have no idea why anyone would want to do this, aside from settling bets or showing off, but it's nice to know that you can.  As for my buddy, he says I cheated.  To which I can only reply, damn straight! :)

  • Avoid Parenthesis in VS 2005/2008 Web Site Project Paths

    Posted Saturday, April 19, 2008 12:44 AM | 2 Comments

    I was developing against a web site project -- you know the ones in Visual Studio 2005/2008 where you can just point to a directory and do your thing (as compared to a web application project with an actual project file) -- and I noticed something a bit odd.  When I compiled the project the Error List was not showing file references, line numbers, columns, or any other information about the location of the compiler errors. 

    I figured Visual Studio was just getting tired since it had been open for days, so I restarted the application in hopes that it would straighten out.  No such luck.  Then I restarted the computer.  That's what tech support normally recommends anyway, so I figured I'd start with the basics.  Once again, no error location information. 

    At this point, I was starting to wonder if it was an issue with Visual Studio 2008 that nobody had noticed yet.  Of course, if VS 2008 wasn't showing error location information on web site projects then there probably would have been an outcry long before this.  So I hit the search engines. 

    It was a pain to find, which is why I'm trying to help publicize the issue, but there are a few references to the exact issue I was having.  Specifically on the following sites:

    http://www.developmentnow.com/g/51_2006_7_0_0_790825/Errors-in-Error-List-with-no-line-numbers.htm

    http://www.dotnetmonster.com/Uwe/Forum.aspx/vs-net-ide/4006/Error-List-Missing-the-Code-File-Reference

    What was the problem?  I was using parenthesis in the path to the web site project.  After removing the parenthesis, the problem was gone.

  • Disabling an ASP.NET Button when Clicked

    Posted Thursday, December 20, 2007 11:55 PM | 9 Comments

    I was answering a question in the ASP.NET forums on Simple-Talk.com (click here you want to check it out) about how to avoid the issue of users submitting multiple page requests when they click on buttons.  My first inclination was hey, just disable the button after they click it and everything will be just fine.  So I fired up Visual Studio and threw the following code into a page:

    <asp:Button runat="server" Text="My Button" OnClientClick="this.disabled=true;" />


    And naturally it failed miserably.  Why?  Because nothing works on the first try -- unless fate is trying to store up some catastrophe points to use on you later.  And apparently if you disable a button in the onclick it doesn't post back for reasons that I haven't dug into very far.  Not to be outwitted by HTML, Javascript, .NET, or whatever else you can blame for your problems, I tried a myriad of random ideas until I hit upon this -- instead of disabling the button when you click it, set the onclick event to fire a function that returns false.  So it looks something like this:

    <asp:Button runat="server" Text="My Button" OnClientClick="this.onclick=new Function('return false;');" />


    This approach effectively disables the button, but doesn't gray it out.  So there you go.  If you want a gray button then this isn't the blog for you, but it does keep people from clicking on it the button more than once.  Naturally, this means that some sticklers out there will whine because the button stays disabled if the request times out or the viewer stops the request manually.  Part of me says leave it disabled as vengeful tribute to the multitudes who quintuple-clicked your button and created a horde of duplicate records for you to delete.  Then there's the other part of me that likes the JavaScript setTimeout function and a bit of a challenge:

    <script type="text/javascript"
       
    function disableButton(button, resetDelay)
       
    {
            button.oldonclick
    = button.onclick;
           
    button.onclick=noClick; //new Function("return false;";
           
    setTimeout("enableButton('"+ button.id + "');" resetDelay);                                    
       
    }
       
    function noClick()
       
    {
            alert
    ("Chill - You already submitted this page once. "+
                   
    "Submitting it twice isn't going to make the "
                   
    "server go faster.  Quit hitting the "+
                   
    "freakin' button!";
           
    return false;
       
    }
       
    function enableButton(buttonId)
       
    {
            var button
    = document.getElementById(buttonId);
           
    if(button!=null)
           
    {
                button.onclick
    = button.oldonclick;
           
    }
        }
    </script>


    The disableButton function copies the "standard" onclick method into a fake property of the button for safe keeping, sets the new onclick to the noClick function (which displays a nice message to the user if they DO try to click), then sets up a delayed function call (read--asynchronous method) that executes after a delay that you set when calling the disableButton method (a value of 1000 for the resetDelay = 1 second, so multiply accordingly for your needs).  Here's an example of what it looks like in a button:

    <asp:Button runat="server" Text="My Button" OnClientClick="disableButton(this,30000)" />


    When you click this button, it gets disabled for 30 seconds.  And if a user clicks on that button in the interim, they even get a little feedback on what's going on.  Just remember, don't blame me when you get fired for pasting the script into your project and forgetting to change the message.

  • WPF: WindowsFormsHost Control Error

    Posted Tuesday, September 04, 2007 7:39 PM | 0 Comments

    I had the code base for my first WPF application ready to go, so I compiled a release version of software and tried to run it from the .exe instead of directly from Visual Studio.  I was promptly greeted with the following error:

    The tag 'WindowsFormsHost' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.

    It ran flawlessly from the Visual Studio .NET debugger, which I found a bit odd.  I tracked the issue back to the following problem.  When I originally referenced the WindowsFormsIntegration.DLL from my project, the "Copy Local" option was set to false.  When I went back in and set that value to True, the application promptly broke when it ran in the debugger.  I don't mind when things break as long as they break consistently, so this was a step in the right direction.  I had found a few helpful forum entries informing me that you have to specify the xml namespace for the WindowsFormsIntegration assembly.  So I added the following xmlns entry:

    xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

    And changed my WindowsFormsIntegration tag from

    <WindowsFormsHost>
        ...
    </WindowsFormsHost>

    to

    <wfi:WindowsFormsHost>
        ...
    </wfi:WindowsFormsHost>

    and it started working just fine.

  • Simple Code Performance Testing

    Posted Friday, August 24, 2007 3:44 PM | 0 Comments

    After posting Performance: Caching vs. Reading from an In-Memory XML Document, there have been some questions about how I actually do the performance testing.  My approach to performance testing is really simple... I just write some code, run that code in a big for loop, and time how long it takes to run through all of those iterations.  Nothing too complicated.  Calculating the speed of the operation becomes a simple matter of (iterations / time).  I've packaged this testing routine into a class I call the PerformanceTimer class, which simplifies things even more.  The code for the class follows, and an example of how to use the class to test a routine follows even further down.


    using System;

    namespace Rebel.Performance
    {
        
    /// <summary>
        ///   Delegate to a testing method
        /// </summary>
        
    public delegate void TestingMethodDelegate(int iterations);

        
    /// <summary>
        ///   Executes a testing method and stores execution duration
        /// </summary>
        
    public class PerformanceTimer
        {
            
    /// <summary>
            ///   Property backer for the ExecutionSpan property
            /// </summary>
            
    private TimeSpan _propExecutionSpan;
            
            
    /// <summary>
            ///   Property backer for the Iterations property
            /// </summary>
            
    private int _propIterations;

            
    /// <summary>
            ///   Duration of testing method execution
            /// </summary>
            
    public TimeSpan ExecutionSpan
            {
                get { 
    return _propExecutionSpan}
                
    private set { _propExecutionSpan value}
            }

            
    /// <summary>
            ///   Number of iterations for the test
            /// </summary>
            
    public int Iterations
            {
                get { 
    return _propIterations}
                
    private set { _propIterations value}
            }

            
    /// <summary>
            ///   Executes testing method and determines execution duration
            /// </summary>
            /// <param name="testingMethod">Delegate to the testing method</param>
            
    public void Run(int iterationsTestingMethodDelegate testingMethod)
            
    {
                Iterations 
    iterations;
                
    long startTimeendTime;
                
    startTime DateTime.Now.Ticks;
                
    testingMethod.Invoke(Iterations);
                
    endTime DateTime.Now.Ticks;
                
    ExecutionSpan = new TimeSpan(endTime startTime);
            
    }

            
    /// <summary>
            ///   Number of iterations per second
            /// </summary>
            
    public double IterationsPerSecond
            {
                get
                {
                    
    return (Iterations ExecutionSpan.TotalSeconds);
                
    }
            }

            
    /// <summary>
            ///   Number of iterations per millisecond
            /// </summary>
            
    public double IterationsPerMillisecond
            {
                get
                {
                    
    return (Iterations ExecutionSpan.TotalMilliseconds);
                
    }
            }

        } 
    //class

    //namespace


    So that's the class, but how do you use it?  Here's a simple test application that uses the PerformanceTimer class to check the speed of concatenation operations.  You've always heard that using a StringBuilder to build a string is faster than repeatedly concatenating a string directly?  Here's a chance to actually prove it.   


    using System;
    using System.Text;
    using Rebel.Performance;

    namespace Rebel.PerformanceTest
    {
        
    /// <summary>
        ///   Console Application
        /// </summary>
        
    class Program
        {

            
    static void Main(string[] args)
            
    {
                PerformanceTimer timer 
    = new PerformanceTimer();
                
    int iterations 100000;

                
    //Run TestA
                
    timer.Run(iterationsnew TestingMethodDelegate(TestMethodA));
                
    Console.WriteLine(timer.IterationsPerMillisecond);
                
                
    //Run TestB
                
    timer.Run(iterationsnew TestingMethodDelegate(TestMethodB));
                
    Console.WriteLine(timer.IterationsPerMillisecond);

                
    Console.ReadLine();

            
    }
            
            
    /// <summary>
            ///   Concatenation using a StringBuilder
            /// </summary>
            
    static void TestMethodA(int iterations)
            
    {
                StringBuilder s 
    = new StringBuilder();
                
    for (int 0iterationsi++)
                
    {
                    s.Append
    ("A");
                
    }
            }

            
    /// <summary>
            ///   Direct concatenation
            /// </summary>
            
    static void TestMethodB(int iterations)
            
    {
                
    string "";
                
    for (int 0iterationsi++)
                
    {
                    s 
    +"A";
                
    }
            }

        } 
    //class

    //namespace
    WARNING: You will want to use as large of an iteration count as possible when testing.  This performance testing approach does the "best" it can when calculating exact start and end times, so some fluctuations are bound to occur when capturing the start and end times.  When they do, the fluctuations throw off the calculations.  Larger iteration counts spread out the effect of the fluctuations and minimize the error.  Think of it this way:  if you are off by 1 in 10, then you have a 10% error.  If you are off by 1 in 10000, you have a 0.01% error.


    On my machine, the StringBuilder operates at 14629 iterations / second and the direct concatenation approach runs at 13 iterations / second.  Pretty significant difference. 

  • Performance: Caching vs. Reading from an In-Memory XML Document

    Posted Wednesday, August 22, 2007 1:01 AM | 4 Comments

    I've been working with a number of XML documents recently.  Basically I'm trying to expose configuration values stored in XML configuration files in an object-oriented structure.  I'm using an in-memory XML document and just referencing values as needed from that document.  The XML reading does not need to be super-high performance because it does not occur very often, but it got me to thinking... what if it did?

    So I ran some performance tests to check the difference between accessing a value from an XML document vs. storing the value in cache and accessing it through a standard get property. 

    The results (at least on my machine) are as follows:

     

    Iterations / Millisecond

    Performance Difference
    XML (attribute value)

    8,648

    90% slower

    XML (inner text value)

    21,694

    76% slower

    Cached Property

    90,140

     

    I knew caching would beat out the other two methods since it's very fast to access a direct variable, but I was surprised that there was such a difference.  I figured there would be a bit of overhead for the inner text property, and a bit more for the attribute lookup, but I was thinking it would be in the range of 10-20% slower.  Live and learn.  Of course, reading from an in-memory XML document is still pretty dang fast, it's just that reading from a cached value is faster.

More Posts Next page »


















<February 2010>
SuMoTuWeThFrSa
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213
Finding Stuff in SQL Server Database DDL
 You'd have thought that nothing would be easier than using SQL Server Management Studio (SSMS) for... Read more...

Mission Critical: SQL Server 2008 Performance Tuning Task List
 In which Buck Woody imagines how the US military would have tackled DBA checklists for... Read more...

Simple Query tuning with STATISTICS IO and Execution plans
 A great deal can be gleaned from the use of the STATISTICS IO and the execution plan, when you are... Read more...

Switching rows and columns in SQL
 When they use SQL Server, one the commoner questions that Ms Access programmers ask is 'Where's the... Read more...

Writing Efficient SQL: Set-Based Speed Phreakery
 Phil Factor's SQL Speed Phreak challenge is an event where coders battle to produce the fastest code to... Read more...