Another option is to handle this via SQLCLR. There is even a method already available in .NET that does this: [TextInfo.ToTitleCase][1] (in `System.Globalization`). This method will Upper-Case the first letter of each word, and Lower-Case the remaining letters. Unlike the other proposals here, it also skips words that are in all upper-case, assuming them to be acronyms. Of course, if this behavior is desired, it would be easy enough to update any of the T-SQL suggestions to do this as well.

One benefit of the .NET method is that it can Upper-Case letters that are Supplementary Characters. For example: [DESERET SMALL LETTER OW][2] has an upper-case mapping of [DESERET CAPITAL LETTER OW][3] <sup>(both show up as boxes when I paste them into here)</sup>, but the `UPPER()` function does not change the lower-case version to upper-case, even when the default Collation for the current Database is set to `Latin1_General_100_CI_AS_SC`.

<!-- language: lang-sql -->

    SELECT N'DESERET SMALL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC35) AS [Thing]
    UNION ALL
    SELECT N'DESERET CAPITAL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC0D) AS [Thing]
    UNION ALL
    SELECT N'SmallButShouldBeCapital' AS [Label], UPPER(NCHAR(0xD801)+NCHAR(0xDC35)) AS [Thing]

Returns (enlarged so you can actually see the Supplementary Character):

[![enter image description here][4]][4]

You can see the full (and current) list of characters that are lower-case and change to upper-case using the following search feature at Unicode.org (you can see the Supplementary Characters by scrolling down until you get to the "DESERET" section, or just hit <kbd>Control-F</kbd> and search for that word):

<http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D>

Though to be honest, this isn't a huge benefit since it is doubtful that anyone is actually using any of the Supplementary Characters that can be title-cased. Either way, here is the SQLCLR code:

<!-- language: c# -->

    using System.Data.SqlTypes;
    using System.Globalization;
    using Microsoft.SqlServer.Server;
    
    public class TitleCasing
    {
        [return: SqlFacet(MaxSize = 4000)]
        [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
        public static SqlString TitleCase([SqlFacet(MaxSize = 4000)] SqlString InputString)
        {
            TextInfo _TxtInf = new CultureInfo(InputString.LCID).TextInfo;
            return new SqlString (_TxtInf.ToTitleCase(InputString.Value));
        }
    }

Here is [@MikaelEriksson's suggestion][5] -- modified slightly to handle `NVARCHAR` data as well as skip words that are all upper-case (to more closely match the behavior of the .NET method) -- along with a test of that T-SQL implementation and of the SQLCLR implementation:

<!-- language: lang-sql -->

    SET NOCOUNT ON;
    DECLARE @a NVARCHAR(50);
    
    SET @a = N'qWeRtY kEyBoArD TEST<>&''"X one&TWO '
             + NCHAR(0xD801)+NCHAR(0xDC28)
             + N'pPLe '
             + NCHAR(0x24D0) -- ⓐ  Circled "a"
             + NCHAR(0xFF24) -- D  Full-width "D"
             + N'D';
    SELECT @a;
    
    SELECT STUFF((
           SELECT N' '
                  + IIF(UPPER(T3.V) <> T3.V COLLATE Latin1_General_100_BIN2, 
                        UPPER(LEFT(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1))
                        + LOWER(STUFF(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')),
                        T3.V)
           FROM (SELECT CAST(REPLACE((SELECT @a AS N'*' FOR XML PATH('')), N' ', N'<X/>')
                 AS XML).query('.')) AS T1(X)
           CROSS APPLY T1.X.nodes('text()') AS T2(X)
           CROSS APPLY (SELECT T2.X.value('.', 'NVARCHAR(50)')) AS T3(V)
           FOR XML PATH(''), TYPE
           ).value('text()[1]', 'NVARCHAR(50)') COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')
                    AS [Capitalize first letter only];
    
    SELECT dbo.TitleCase(@a);

[![enter image description here][6]][6]

Another difference in behavior is that this particular T-SQL implementation splits on only spaces, whereas the `ToTitleCase()` method considers most non-letters to be word separators (hence the difference in handling of the "one&TWO" part).

Finally, one unexpected downside to the SQLCLR version is that in coming up with various tests, I found a bug in the .NET code related to its handling of the Circled Letters (which has now been [reported][7] on Microsoft Connect). The .NET library treats the Circled Letters as word separators, which is why it does not turn the "ⓐDD" into "Ⓐdd" as it should.


  [1]: https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx
  [2]: http://unicode.org/cldr/utility/character.jsp?a=10435
  [3]: http://unicode.org/cldr/utility/character.jsp?a=1040D
  [4]: https://i.sstatic.net/Yn70F.jpg
  [5]: http://dba.stackexchange.com/a/139389/30859
  [6]: https://i.sstatic.net/DbSJf.jpg
  [7]: https://connect.microsoft.com/VisualStudio/feedback/details/2855342/textinfo-totitlecase-incorrectly-treating-circled-letters-as-word-separators