将 Mc 姓氏的大小写更改为正确的大小写
Change the case on Mc surnames to proper case
我 运行 一个函数,用于更新一些表上的某些列以将 UPPERCASE 更改为 ProperCase。我没有考虑 'Mc' 或 'Mac' 姓氏。所以现在我所有的麦克姓都变成麦克姓了。
有没有人有任何脚本可以修改 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
如果我们首先将前缀放在变量中。
然后我们需要过滤table,使其后面至少有两个字符。
我们更新table,这样新值就是前缀,后面是下一个字母的大写,后面是原来值的其余部分。
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]%';
您可以 运行 使用两个不同的前缀两次。
我 运行 一个函数,用于更新一些表上的某些列以将 UPPERCASE 更改为 ProperCase。我没有考虑 'Mc' 或 'Mac' 姓氏。所以现在我所有的麦克姓都变成麦克姓了。
有没有人有任何脚本可以修改 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
如果我们首先将前缀放在变量中。
然后我们需要过滤table,使其后面至少有两个字符。
我们更新table,这样新值就是前缀,后面是下一个字母的大写,后面是原来值的其余部分。
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]%';
您可以 运行 使用两个不同的前缀两次。