将大写数据库转换为正确的大小写

时间:2011-05-31 23:06:12

标签: sql-server-2008

我是SQL新手,我有几个大型数据库,大写的名字和姓氏,我需要在SQL Server 2008中转换为正确的大小写。

我正在使用以下内容来执行此操作:

update database 
Set FirstNames = upper(substring(FirstNames, 1, 1))
                     + lower(substring(FirstNames, 2, (len(FirstNames) - 1) ))

我想知道是否有任何方法可以对此进行调整,以便更新具有两个名字的字段(目前我进行更改,然后通过并手动更改第二个名称)。

与上面的查询相比,我已经查看了该字段中的其他答案,它们似乎都很长。

还有什么方法可以帮助转换Mc suranmes(我会手动改变其他人)吗? MCDONALD到McDonald,我再次使用about查询,但用LastName替换了FirstNames。

3 个答案:

答案 0 :(得分:1)

这可能最好在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中搜索关键名称('McDonald','McGrew'等)或模式(前两个字母是Mc然后制作下一个资本等)第二种方式将这些案例(全名)放在一个表中,并将其替换值放在第二列。然后简单地做一个替换。然而,最有可能的是,最简单的方法是确定像Mc这样的规则然后大写,而不是试图列出每个姓氏的可能性。

不要忘记您可能希望修改上面的UDF以包含破折号,而不仅仅是空格。

答案 1 :(得分:1)

也许这太长了但很容易,可以适应-'等等:

UPDATE tbl SET LastName = Case when (CharIndex(' ',lastname,1)<>0) then (Upper(Substring(lastname,1,1))+Lower(Substring(lastname,2,CharIndex(' ',lastname,1)-1)))+ 
 (Upper(Substring(lastname,CharIndex(' ',lastname,1)+1,1))+
 Lower(Substring(lastname,CharIndex(' ',lastname,1)+2,Len(lastname)-(CharIndex(' ',lastname,1)-1)))) 
  else (Upper(Substring(lastname,1,1))+Lower(Substring(lastname,2,Len(lastname)-1))) end, 
FirstName = Case when (CharIndex(' ',firstname,1)<>0) then (Upper(Substring(firstname,1,1))+Lower(Substring(firstname,2,CharIndex(' ',firstname,1)-1)))+ 
 (Upper(Substring(firstname,CharIndex(' ',firstname,1)+1,1))+
 Lower(Substring(firstname,CharIndex(' ',firstname,1)+2,Len(firstname)-(CharIndex(' ',firstname,1)-1)))) 
  else (Upper(Substring(firstname,1,1))+Lower(Substring(firstname,2,Len(firstname)-1))) end;

答案 2 :(得分:0)

Tony Rogerson包含以下代码:

  • 双管名称,例如Arthur Bentley-Smythe
  • 控制字符

我自己没有用过它......