Page 1 of 4

Proper Case User Defined Function T-SQL

The Problem

We have UPPERCASE (or lowercase) text in our database and we want to convert it to ProperCase/TitleCase for reporting purposes. This involves converting the text into lowercase and converting the first letter of each word into UPPERCASE.

e.g.

Convert this:A LONG TIME AGO IN A GALAXY FAR, FAR AWAY

To this: A Long Time Ago In A Galaxy Far, Far Away

Unfortunately, the problem is not always this simple; sometimes you might want to make exceptions. In the text above you might decide that "in" and "a" are not important enough to be capitalised.

e.g. A Long Time Ago in a Galaxy Far, Far Away

You might have other exceptions such RAM, TFT, CPU, ASCII. Some exceptions might also be of mixed case, such as DoS, QoS,WiseSoft, TomTom. Creating a Proper Case function is not an exact science, and this is probably why it wasn't included as a system function in T-SQL.

The Solution

A solution is required that can convert the first letter of each word into UPPERCASE and the rest of the word into lowercase. In addition it needs to be able to handle exceptions such as those mentioned previously. The function will allow a user to specify a list of exceptions, by inputting them into them into one of the functions parameters and also handle a few expected grammatical exceptions.

In some situations, you might want to assume that words of a specified length should by UPPERCASE, so the function will have 3 parameters in total:

@Value - The text you want to convert

@Exceptions – A list of exceptions. Exceptions will be printed exactly as specified. Specify NULL if you have no exceptions.

@UCASEWordLength – Words shorter than the value specified will automatically be printed in UPPERCASE. Specify NULL if you don’t want to use this feature.

The function will convert the text to lower case, and then parse the text character by character. The first character is converted to UPPERCASE. Each character is appended to a “word” variable until a white space/punctuation character is reached, marking the end of the word. At this point the word will be compared to the list of user exceptions and the case converted if required. Some common grammatical exceptions will also be checked – e.g. WON'T will be converted to Won't with these exceptions instead of Won'T. The function will display names such as O'Donnell correctly. Once the word has been cased correctly with exceptions accounted for, it is appended to a variable used to store the return value along with the white space/punctuation character following it. The process is repeated until all of the text has been converted.

T-SQL Code

CREATEFUNCTION [dbo].[fProperCase](@Value varchar(8000), @Exceptions varchar(8000),@UCASEWordLength tinyint)

returnsvarchar(8000)

as

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Function Purpose:To convert text to Proper Case.

Created By:David Wiseman

Website:

Created:2005-10-03

Updated:2006-06-22

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

INPUTS:

@Value :This is the text to be converted to Proper Case

@Exceptions:A list of exceptions to the default Proper Case rules. e.g. |RAM|CPU|HDD|TFT|

Without exception list they would display as Ram, Cpu, Hdd and Tft

Note the use of the Pipe "|" symbol to separate exceptions.

(You can change the @sep variable to something else if you prefer)

@UCASEWordLength:You can specify that words less than a certain length are automatically displayed in UPPERCASE

USAGE1:

Convert text to ProperCase, without any exceptions

select dbo.fProperCase('THIS FUNCTION WAS CREATED BY DAVID WISEMAN',null,null)

> This Function Was Created By David Wiseman

USAGE2:

Convert text to Proper Case, with exception for WiseSoft

select dbo.fProperCase('THIS FUNCTION WAS CREATED BY DAVID WISEMAN @ WISESOFT','|WiseSoft|',null)

> This Function Was Created By David Wiseman @ WiseSoft

USAGE3:

Convert text to Proper Case and default words less than 3 chars to UPPERCASE

select dbo.fProperCase('SIMPSON, HJ',null,3)

> Simpson, HJ

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

begin

declare @sep char(1)-- Seperator character for exceptions

declare @i int-- counter

declare @ProperCaseText varchar(5000)-- Used to build our Proper Case string for Function return

declare @Word varchar(1000)-- Temporary storage for each word

declare @IsWhiteSpace asbit-- Used to indicate whitespace character/start of new word

declare @c char(1)-- Temp storage location for each character

set @Word =''

set @i = 1

set @IsWhiteSpace = 1

set @ProperCaseText =''

set @sep ='|'

-- Set default UPPERCASEWord Length

if @UCASEWordLength isnullset @UCASEWordLength = 1

-- Convert user input to lower case (This function will UPPERCASE words as required)

set @Value =LOWER(@Value)

-- Loop while counter is less than text lenth (for each character in...)

while(@i <=len(@Value)+1)

begin

-- Get the current character

set @c =SUBSTRING(@Value,@i,1)

-- If start of new word, UPPERCASE character

if @IsWhiteSpace = 1 set @c =UPPER(@c)

-- Check if character is white space/symbol (using ascii values)

set @IsWhiteSpace =casewhen(ASCII(@c)between 48 and 58)then 0

when(ASCII(@c)between 64 and 90)then 0

when(ASCII(@c)between 96 and 123)then 0

else 1 end

if @IsWhiteSpace = 0

begin

-- Append character to temp @Word variable if not whitespace

set @Word = @Word + @c

end

else

begin

-- Character is white space/punctuation/symbol which marks the end of our current word.

-- If word length is less than or equal to the UPPERCASE word length, convert to upper case.

-- e.g. you can specify a @UCASEWordLength of 3 to automatically UPPERCASE all 3 letter words.

set @Word =casewhenlen(@Word)<= @UCASEWordLength thenUPPER(@Word)else @Word end

-- Check word against user exceptions list. If exception is found, use the case specified in the exception.

-- e.g. WiseSoft, RAM, CPU.

-- If word isn't in user exceptions list, check for "known" exceptions.

set @Word =casewhencharindex(@sep + @Word + @sep,@exceptions collate Latin1_General_CI_AS) 0

thensubstring(@exceptions,charindex(@sep + @Word + @sep,@exceptions collate Latin1_General_CI_AS)+1,len(@Word))

when @Word ='s'andsubstring(@Value,@i-2,1)=''''then's'-- e.g. Who's

when @Word ='t'andsubstring(@Value,@i-2,1)=''''then't'-- e.g. Don't

when @Word ='m'andsubstring(@Value,@i-2,1)=''''then'm'-- e.g. I'm

when @Word ='ll'andsubstring(@Value,@i-3,1)=''''then'll'-- e.g. He'll

when @Word ='ve'andsubstring(@Value,@i-3,1)=''''then've'-- e.g. Could've

else @Word end

-- Append the word to the @ProperCaseText along with the whitespace character

set @ProperCaseText = @ProperCaseText + @Word + @c

-- Reset the Temp @Word variable, ready for a new word

set @Word =''

end

-- Increment the counter

set @i = @i + 1

end

return @ProperCaseText

end

Created by David Wiseman