如何修改SQL Server 2016的InitCap函数使指定单词始终小写?
修改SQL Server 2016的InitCap函数以保留指定单词小写
以下是修改后的函数代码,实现了字符串首字母大写逻辑的同时,让de、da、do、dos、das、d'这些单词/前缀始终保持小写:
FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) RETURNS VARCHAR(4000) AS BEGIN DECLARE @Index INT DECLARE @Char CHAR(1) DECLARE @PrevChar CHAR(1) DECLARE @OutputString VARCHAR(4000) -- 修正长度,避免截断长字符串 DECLARE @CurrentWord VARCHAR(10) SET @OutputString = LOWER(@InputString) SET @Index = 1 WHILE @Index <= LEN(@InputString) BEGIN SET @Char = SUBSTRING(@InputString, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputString, @Index - 1, 1) END IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') BEGIN -- 截取当前位置开始的单词,判断是否属于需保留小写的列表 SET @CurrentWord = LTRIM(SUBSTRING(@OutputString, @Index, 10)) SET @CurrentWord = LEFT(@CurrentWord, CHARINDEX(' ', @CurrentWord + ' ') - 1) -- 仅当当前单词不在保留列表时,执行首字母大写 IF NOT ( @CurrentWord IN ('de','da','do','dos','das') OR @CurrentWord LIKE 'd''%' ) BEGIN IF @PrevChar != '''' OR UPPER(@Char) != 'S' SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) END END SET @Index = @Index + 1 END RETURN @OutputString END
关键改动说明
- 修正字符串长度限制:将
@OutputString的类型从VARCHAR(255)改为VARCHAR(4000),匹配输入参数的长度,避免长字符串被截断。 - 新增目标单词检测逻辑:在准备将字符转为大写前,先截取当前位置开始的单词,判断是否属于指定的小写保留列表。如果是,则跳过首字母大写操作。
- 兼容特殊格式
d':通过LIKE 'd''%'匹配以d'开头的前缀,确保这类格式也保持小写。
测试示例
输入:'DE OLIVEIRA DA SILVA DO BRASIL D'ARCY'
输出:'de Oliveira da Silva do Brasil d'Arcy'
内容的提问来源于stack exchange,提问作者Douglas Filipe
相关产品推荐
相关产品推荐

