我在 SQL Server 2016 中有这个函数可以将第一个字符更改为大写:
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(255)
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
IF @PrevChar != '''' OR UPPER(@Char) != 'S'
SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
END
SET @Index = @Index + 1
END
RETURN @OutputString
END
但现在我需要列表中的某些单词总是较低:
de
da
do
dos
das
d'
如何更改代码来修复它?
我认为听取 HABO 的建议可能是最实用的。我修改了代码并添加了每个单词的评估以检查列表
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(255)
DECLARE @WordStartIndex INT
-- Table to hold words that should always be lowercase
DECLARE @LowercaseWords TABLE (Word VARCHAR(255))
-- Populate the table with words that must remain in lowercase
INSERT INTO @LowercaseWords (Word)
VALUES ('and'), ('the'), ('of'), ('in'), ('on'), ('or'), ('to'), ('for') -- Add your words that you want lower caps in here.
SET @OutputString = LOWER(@InputString)
SET @Index = 1
SET @CurrentWord = ''
SET @WordStartIndex = 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
-- Check if new word is starting
IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
BEGIN
-- Reset current word
SET @CurrentWord = ''
SET @WordStartIndex = @Index
END
-- Append current character to current word
SET @CurrentWord = @CurrentWord + @Char
IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(', ')') OR @Index = LEN(@InputString)
BEGIN
-- Check if the current word is in the table of lowercase words
IF NOT EXISTS (SELECT 1 FROM @LowercaseWords WHERE Word = LTRIM(RTRIM(@CurrentWord)))
BEGIN
SET @OutputString = STUFF(@OutputString, @WordStartIndex, 1, UPPER(SUBSTRING(@CurrentWord, 1, 1)))
END
END
SET @Index = @Index + 1
END
RETURN @OutputString
END