4

我正在使用 SQL 2012 RC0,并寻找一个可以将包含名字和姓氏的列转换为正确/标题大小写的函数。我环顾四周,但似乎找不到任何东西,如果有另一篇文章,请告诉我,我会关闭这个。

我要转换的表格列是从 Web 前端的用户输入字段填充的,因此有时不会以可用于在客户报告中填充名称字段的格式输入(感谢在前端可以做得更严格,但这并不能解决已经在数据库中的客户的问题)。

有谁知道如何在 t-sql 中做到这一点?SQL 2012 是否有任何可用的字符串函数来执行此操作?或者我应该寻找一种通过 CLR (C#) 存储过程执行此操作的方法?

4

2 回答 2

6

正确的情况是很难做到的。想想 Van der Wilden 和 VanWyck 这样的名字。几年前我编写了一个 T-SQL 函数,但除了使用 CLR 之外,SQL Server 2012 中确实没有任何新功能可以帮助解决这个问题:

http://web.archive.org/web/20120215192418/http://classicasp.aspfaq.com/general/how-do-i-convert-a-name-to-proper-case.html

PS你为什么还在使用RC0?RTM (11.0.2100) 今天发布...

于 2012-03-07T04:38:25.230 回答
0

如果您安装了 MDS(SQL 2005 及更高版本),您可以通过正则表达式正确处理大小写。

您需要添加更多内容来处理提到的“Van der Wilden”,但它可以扩展到甚至处理这个问题。

CASE 
WHEN mds.mdq.RegexIsMatch([First Name],'[A-Z]{1,}(\s|\-)[A-Z]{2,}',7)=1 THEN

UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7),1,1))+lower(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7))-1))
+ mds.mdq.RegexExtract([First name],'(?<Sep>(\s|\-))','Sep',7) + SUBSTRING(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7),1,1)+ LOWER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7),2,LEN(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7))-1))

WHEN mds.mdq.RegexIsMatch([First Name],'[A-Z]{1,}\s[A-Z]{1}',7)=1 THEN

UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7),1,1))+
lower(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7))-1))
+ ' ' + mds.mdq.RegexExtract([First Name],'\s(?<MI>.*)','MI',7)+'.'
ELSE
UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7),1,1))+
LOWER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7))-1))
END 
,
[Last Name]=CASE
WHEN mds.mdq.RegexIsMatch([Last Name],'(\s|\-)',7)=1
THEN
SUBSTRING(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7),1,1)+LOWER(SUBSTRING(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7),2,LEN(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7))-1))+
mds.mdq.RegexExtract([last name],'(?<Sep>(\s|\-))','Sep',7)+
SUBSTRING(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7),1,1)+LOWER(SUBSTRING(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7),2,LEN(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7))-1))
Else
SUBSTRING([Last Name],1,1) +LOWER(SUBSTRING([last name],2,LEN([Last Name])-1))
END 
于 2016-05-09T14:47:23.067 回答