我有一个t-sql函数,我在网上发现,也许是在堆栈上,它非常适合用于字符串中包含所有单词的驼峰:
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
WHILE @Position > 0
SELECT @String = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin,
@Position = PATINDEX('%[^A-Za-z''][a-z]%',@String COLLATE Latin1_General_Bin);
RETURN ISNULL(@String,'');
END
问题是我现在需要一个轻微的mod,这样除了每个单词的第一个字母之外它只剩下一个。我仍然希望它能把每个单词的第一个字母大写,但是我不希望它改变那个单词中的其他字母。所以这里有一些我想要的结果的例子:
'here is foo' -> 'Here Is Foo'
'i like the FBI' -> 'I Like The FBI'
对于第二个例子,请注意上面显示的我的功能改变了" FBI"到了" Fbi",这就是问题所在。我不确定如何更改sql以实现它,以便将FBI作为FBI。当然,如果原始字符串是" fbi",我知道它会改变为" Fbi",那很好。
总之,我从不希望函数将大写字母更改为小写。
答案 0 :(得分:2)
在STUFF()中删除LOWER():
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(@String,1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
WHILE @Position > 0
SELECT @String = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin,
@Position = PATINDEX('%[^A-Za-z''][a-z]%',@String COLLATE Latin1_General_Bin);
RETURN ISNULL(@String,'');
END
GO
DECLARE @String VARCHAR(75) = 'i like the FBI'
SELECT dbo.InitialCap(@String)
结果:
I Like The FBI