我调整了一些以处理名称中包含的后缀。这几乎处理了我扔给它的任何东西。我们有时在一些后缀之后有连字符的名称和句点。我知道从 I-IX 处理是多余的,但很容易将 X 添加到 V 检查。
ALTER FUNCTION dbo.udf_ProperCase
(@Text as varchar(1024))
RETURNS varchar(1024)
AS
/*
Created to ProperCase most common LastName (Mc/Mac/O'/D'/L') and handle I(first)-IX(nineteenth) suffixes
Original Code: https://stackoverflow.com/questions/22923616/sql-proper-case-function-query-refinement
SELECT dbo.udf_ProperCase('iitest demetrii mcdonald o''neil victor second 2nd ii iii iv v vi vii viii ix x xi test')
*/
BEGIN
DECLARE @Reset bit
DECLARE @Ret varchar(1024)
DECLARE @i int
DECLARE @c char(1)
DECLARE @Text1 varchar(1025)
SELECT @Reset = 1, @i=1, @Ret = '', @Text1 = ' ' + @Text + ' ' --Ensure one space before to make first char upper and after to handle suffixes
--Loop through each character, comparing prior/next to determine if need to handle
WHILE @i <= LEN(@Text1)
BEGIN
SELECT
@c= SUBSTRING(@Text1,@i,1)
,@Ret = @Ret + CASE WHEN @Reset=1 THEN UPPER(@c) ELSE LOWER(@c) END
,@Reset= CASE
WHEN
CASE
WHEN SUBSTRING(@Text1,@i-2,3) like '[ -][DdOoLl][''`]' THEN 1 --Names (including hyphenated) beginning with D/O/L
WHEN SUBSTRING(@Text1,@i-2,4) like ' [Mm][cC][a-zA-Z]' THEN 1 --Names with Mc
WHEN SUBSTRING(@Text1,@i-3,5) like ' [Mm][Aa][cC][a-zA-Z]' THEN 1 --Names with Mac
WHEN SUBSTRING(@Text1,@i-1,4) like ' [Ii][Ii][ .]' THEN 1 --Handle II (include ending with Space or period)
WHEN SUBSTRING(@Text1,@i-1,5) like ' [Ii][Ii][Ii][ .]' THEN 1 --Handle III
WHEN SUBSTRING(@Text1,@i-2,4) like ' [Ii][Ii][ .]' THEN 1 --Handle II
WHEN SUBSTRING(@Text1,@i-2,5) like ' [Ii][Ii][Ii][ .]' THEN 1 --Handle III
WHEN SUBSTRING(@Text1,@i-3,4) like ' [Ii][Ii][ .]' THEN 1 --Handle II
WHEN SUBSTRING(@Text1,@i-3,5) like ' [Ii][Ii][Ii][ .]' THEN 1 --Handle III
WHEN SUBSTRING(@Text1,@i-1,4) like ' [Ii][VvXx][ .]' THEN 1 --Handle IV
WHEN SUBSTRING(@Text1,@i-1,4) like ' [VvXx][Ii][ .]' THEN 1 --Handle VI
WHEN SUBSTRING(@Text1,@i-1,5) like ' [VvXx][Ii][Ii][ .]' THEN 1 --Handle VII
WHEN SUBSTRING(@Text1,@i-1,6) like ' [VvXx][Ii][Ii][Ii][ .]' THEN 1 --Handle VIII
WHEN SUBSTRING(@Text1,@i-2,4) like ' [VvXx][Ii][ .]' THEN 1 --Handle VI
WHEN SUBSTRING(@Text1,@i-2,5) like ' [VvXx][Ii][Ii][ .]' THEN 1 --Handle VII
WHEN SUBSTRING(@Text1,@i-2,6) like ' [VvXx][Ii][Ii][Ii][ .]' THEN 1 --Handle VIII
WHEN SUBSTRING(@Text1,@i-3,4) like ' [VvXx][Ii][ .]' THEN 1 --Handle VI
WHEN SUBSTRING(@Text1,@i-3,5) like ' [VvXx][Ii][Ii][ .]' THEN 1 --Handle VII
WHEN SUBSTRING(@Text1,@i-3,6) like ' [VvXx][Ii][Ii][Ii][ .]' THEN 1 --Handle VIII
ELSE 0
END = 1 THEN 1
ELSE
CASE
WHEN @c like '[a-zA-Z`]' or @c in ('''') or @c like '[0-9]' THEN 0 --If any letter, single-quote or number, then keep next lowercase
ELSE 1 --Anything else (e.g. Space dash, And(&), etc. make next Upper-Case)
END
END
,@i = @i +1
END
RETURN stuff(@Ret, 1, 1, '')
END
GO