Это, вероятно, лучше всего делать вне SQL. Тем не менее, если есть требование сделать это на сервере или если скорость не является проблемой (потому что это будет проблемой, поэтому вам нужно выяснить, если вы заботитесь), то способ, которым вы идете по этому поводу, вероятно, является лучшим способ сделать это. Если хотите, вы можете создать UDF, который поместит всю логику в одну область.
Вот код, с которым я столкнулся (с указанием авторства и дополнительной информацией под ним):
CREATE FUNCTION dbo.fCapFirst(@input NVARCHAR(4000)) RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @position INT
WHILE IsNull(@position,Len(@input)) > 1
SELECT @input = Stuff(@input,IsNull(@position,1),1,upper(substring(@input,IsNull(@position,1),1))),
@position = charindex(' ',@input,IsNull(@position,1)) + 1
RETURN (@input)
END
--Call it like so
select dbo.fCapFirst(Lower(Column)) From MyTable
Я получил этот код от http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=37760 На этом форуме также есть дополнительная информация и другие предложения.
Что касается случаев, подобных Макдональду, я бы предложил один из двух способов справиться с этим. Можно было бы выполнить поиск в вышеуказанной UDF по ключевым словам («Макдональд», «МакГрю» и т. Д.) Или по шаблонам (первые две буквы - «Мак», затем заглавная, и т. Д.). Второй способ: поместить эти случаи (полные имена) в таблицу и заменить их значения во втором столбце. Тогда просто сделайте замену. Скорее всего, однако, будет проще определить правила, такие как Mc, затем использовать заглавные буквы, а не пытаться перечислить каждую возможность фамилии.
Не забывайте, что вы можете изменить вышеуказанный UDF, чтобы он включал в себя тире, а не только пробелы.