Ссылка, опубликованная выше, является отличным вариантом, который затрагивает основную проблему: мы никогда не можем программно учитывать все случаи (Smith-Jones, von Haussen, John Smith M.D.), по крайней мере, не изящно. Тони вводит понятие об исключительном / прерывающемся характере для решения этих случаев. В любом случае, опираясь на идею Cervo (верхние все нижние символы, предшествующие пробелу), операторы replace могут быть завернуты вместо одной таблицы вместо замены. Действительно, любая комбинация символов с низким / верхним значением может быть вставлена в @alpha, и инструкция не изменится:
declare @str nvarchar(8000)
declare @alpha table (low nchar(1), up nchar(1))
set @str = 'ALL UPPER CASE and SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ'
-- stage the alpha (needs number table)
insert into @alpha
-- A-Z / a-z
select nchar(n+32),
nchar(n)
from dbo.Number
where n between 65 and 90 or
n between 192 and 223
-- append space at start of str
set @str = lower(' ' + @str)
-- upper all lower case chars preceded by space
select @str = replace(@str, ' ' + low, ' ' + up)
from @Alpha
select @str