You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

关键改动说明

  1. 修正字符串长度限制:将@OutputString的类型从VARCHAR(255)改为VARCHAR(4000),匹配输入参数的长度,避免长字符串被截断。
  2. 新增目标单词检测逻辑:在准备将字符转为大写前,先截取当前位置开始的单词,判断是否属于指定的小写保留列表。如果是,则跳过首字母大写操作。
  3. 兼容特殊格式d':通过LIKE 'd''%'匹配以d'开头的前缀,确保这类格式也保持小写。

测试示例

输入:'DE OLIVEIRA DA SILVA DO BRASIL D'ARCY'
输出:'de Oliveira da Silva do Brasil d'Arcy'

内容的提问来源于stack exchange,提问作者Douglas Filipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:30:27