将 Mc 姓氏的大小写更改为正确大小写

问题描述

我运行了一个函数来更新几个表上的某些列,以将 UPPERCASE 更改为 ProperCase。我没有考虑 'Mc' 或 'Mac' 姓氏。所以现在我所有的 McSurnames 都变成了 McSurnames。

有人可以修改 McSurname 的脚本吗?

感谢任何帮助。

谢谢。

解决方法

这可能是一个滑坡。你会发现很多例外。也就是说,这是我的适当功能的缩小版本。

示例

Select [dbo].[svf-Str-Proper]('john old macdonald ii phd,dds llc')

退货

(No column name)
John Old MacDonald II PhD,DDS LLC

需要的功能

CREATE FUNCTION [dbo].[svf-Str-Proper] (@S varchar(max))
Returns varchar(max)
As
Begin
    Set @S = ' '+replace(replace(Lower(@S),'   ',' '),'  ',' ')+' '
    ;with cte1 as (Select * From (Values(' '),('-'),('/'),('\'),('['),('{'),('('),('.'),(','),('&'),(' Mc'),(' Mac'),(' O''') ) A(P)),cte2 as (Select * From (Values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'),('LLC'),('PhD'),('MD'),('DDS'),('II '),('III '),('IV '),('ID '),('PW ')
                                 ) A(S)),cte3 as (Select F = Lower(A.P+B.S),T = A.P+B.S From cte1 A Cross Join cte2 B 
                   Union All 
                   Select F = Lower(B.S+A.P),T = B.S+A.P From cte1 A Cross Join cte2 B where A.P in ('&') 
                  ) 
    Select @S = replace(@S,F,T) From cte3 
    Return rtrim(ltrim(@S))
End
,

如果我们先把前缀放在一个变量中。

然后我们需要过滤表格,使其后面至少有两个字符。

我们更新表,使新值是前缀,后跟下一个字母的大写,然后是原始值的其余部分。

DECLARE @prefix nvarchar(100) = 'Mc'; -- or Mac

UPDATE table
SET lastname = @prefix + UPPER(SUBSTRING(lastname,LEN(@prefix) + 1,1)) + SUBSTRING(lastname,LEN(@prefix) + 2,LEN(lastname)
WHERE lastname LIKE @prefix + '[a-z][a-z]%';

您可以使用两个不同的前缀运行两次。