我是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。
答案 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)