我想将表中的列值更新为“标题”情况

gau*_*v b -1 sql sql-server

我在数据库中有一个表,其中存在列名,我想将该名称字段中的值更新为“标题”大小写。

范例: "abc asd""Abc Asd"

考虑到表中有数百万条记录,我想知道使用SQL的最佳方法是什么。

Joh*_*tti 5

数据卫生是一场持续的战斗。适当的案例从来没有像人们想象的那么简单。从野外消费数据时,存在多种变体和不一致之处。

这是一项必要时可以扩展的功能。

全面披露:还有许多其他性能更高的功能,但是它们倾向于采用过于简化的方法。

Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
('old mcdonald'),
('dr. Langdon ,dds'),
('b&o railroad'),
('john-m-smith'),
('CARSON/jACOBS'),
('jAmes o''neil')

 Select *
       ,ProperCase = [dbo].[svf-Str-Proper](SomeCol)
 From @YourTable
Run Code Online (Sandbox Code Playgroud)

退货

SomeCol             ProperCase
old mcdonald        Old McDonald
dr. Langdon ,dds    Dr. Langdon ,DDS
b&o railroad        B&O Railroad
john-m-smith        John-M-Smith
CARSON/jACOBS       Carson/Jacobs
jAmes o'neil        James O'Neil
Run Code Online (Sandbox Code Playgroud)

UDF(如果有兴趣)

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'),(' 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')
                                 ) A(S))
         ,cte3 as (Select F = Lower(A.P+B.S),T = A.P+B.S From cte1 A Cross Join cte2 B ) 
    Select @S = replace(@S,F,T) From cte3
    Return rtrim(ltrim(@S))
End
-- Syntax :  Select [dbo].[svf-Str-Proper]('old mcdonald phd,dds llc b&o railroad')
Run Code Online (Sandbox Code Playgroud)