T-SQL初始化 - 仅留下2-n个字符

时间:2015-03-10 17:07:31

标签: tsql

我有一个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",那很好。

总之,我从不希望函数将大写字母更改为小写

1 个答案:

答案 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