SQL Server 包含用于查看/更新字符串数据为大写和小写但不是正确大小写的系统函数。有多种原因希望此操作发生在 SQL Server 中而不是在应用程序层中。就我而言,我们在整合来自多个来源的全球人力资源数据期间执行了一些数据清理。
如果您在互联网上搜索,您会发现此任务的多种解决方案,但许多似乎有限制性警告或不允许在函数中定义例外。
注意:正如下面评论中提到的,SQL Server 不是执行此转换的理想场所。还建议了其他方法 - 例如 CLR。在我看来,这篇文章已经达到了它的目的——将所有这些想法集中在一个地方真是太好了,而不是随处可见的随机花絮。谢谢你们。
使用这些方法将遇到的挑战是您丢失了信息。向业务用户解释他们拍摄了一张模糊、失焦的照片,尽管他们在电视上看到了什么,但无法使其清晰且清晰。总会有这些规则不起作用的情况,只要每个人都知道这是这种情况,那就去做吧。
这是 HR 数据,所以我假设我们正在讨论以一致的标题格式格式获取姓名,因为大型机将其存储为AARON BERTRAND,我们希望新系统不会对他们大喊大叫。亚伦很容易(但并不便宜)。您和 Hannah 已经确定了 Mc/Mac 的问题,因此它正确地大写了 Mc/Mac,但在某些情况下它对 Mackey/ Maclin /Mackenzie 过于激进。不过,Mackenzie 是一个有趣的案例 - 看看它作为婴儿名字的受欢迎程度如何
在某个时候,会有一个可怜的孩子叫麦肯齐麦肯齐,因为人是可怕的存在。
你也会遇到像 D'Antoni 这样可爱的东西,我们应该在刻度线周围加上两个字母。除了 d'Autremont,您只将撇号后的字母大写。但是,如果您将邮件发送给 d'Illoni,因为他们的姓氏是 D'illoni,天堂会帮助您。
为了提供实际代码,以下是我们在 2005 实例中使用的 CLR 方法。它通常使用 ToTitleCase,除了我们构建的例外列表,这是我们基本上放弃尝试编写上述例外的时候。
既然所有这些都清楚了,我要完成这本可爱的 ee cummings 诗集
我意识到你已经有了一个很好的解决方案,但我想我会添加一个使用 Inline-Table-Valued-Function 的更简单的解决方案,尽管它依赖于使用即将推出的“vNext”版本的 SQL Server,其中包括
STRING_AGG()
和STRING_SPLIT()
功能:测试功能:
有关STRING_AGG()和STRING_SPLIT()的文档,请参阅 MSDN
请记住,该
STRING_SPLIT()
功能不保证以任何特定顺序返回项目。这可能是最烦人的。有一个 Microsoft 反馈项要求将一列添加到 STRING_SPLIT 的输出中以表示输出的顺序。考虑在这里投票如果您想生活在边缘,并且想使用这种方法,可以将其扩展为包括异常。我已经构建了一个内联表值函数,它就是这样做的:
测试它显示了它是如何工作的:
我遇到的最佳解决方案可以在这里找到。
我稍微修改了脚本:我在返回值中添加了 LTRIM 和 RTRIM,因为在某些情况下,脚本会在值之后添加空格。
预览从大写数据到正确大小写的转换的用法示例,但有以下例外:
该脚本真正简单而强大的方面是能够在函数调用本身中定义异常。
但是需要注意的一点是:
目前编写的脚本不能正确处理 Mc[AZ]%、Mac[AZ]% 等姓氏。我目前正在编辑以处理这种情况。
作为一种解决方法,我更改了函数的返回参数:REPLACE(REPLACE(LTRIM(RTRIM((@ProperCaseText))),'Mcd','McD'),'Mci','McI') 等......
这种方法显然需要对数据有预知,并不理想。我确信有办法解决这个问题,但我正处于转换过程中,目前没有时间专门解决这个令人讨厌的问题。
这是代码: