传递给SUBSTRING函数的长度参数无效

时间:2014-03-07 17:28:34

标签: tsql

我已经编写了查询,但它正在运行:

declare @word as nvarchar (20)
set @word = 'victOR aALEXander'
select upper(left(@word, 1)) + lower(SUBSTRING(@word,2,charindex(' ', @word)-2)) + ' ' + 
upper(left(substring(@word,charindex(' ', @word)+1,len(@word)-1),1)) 
+ lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word)))

我创建了这个函数:

  alter function letters ( @word as nvarchar(20))
returns varchar(20) as begin
return upper(left(@word, 1)) + lower(SUBSTRING(@word,2,charindex(' ', @word)-2)) + ' ' + 
upper(left(substring(@word,charindex(' ', @word)+1,len(@word)-1),1)) 
+ lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word))) end

最后我做了:

select dbo.letters(users)
from dbo.tempdb

我有:

传递给SUBSTRING函数的长度参数无效

为什么?

4 个答案:

答案 0 :(得分:0)

@word参数的字符数小于子字符串数。此外,参数可以是null

答案 1 :(得分:0)

如果您在开头和结尾都有空格,也可以尝试修剪:

alter function letters ( @word as nvarchar(20))
returns varchar(20) as 
begin
set @word = ltrim(rtrim(@word))
return upper(left(@word, 1)) + lower(SUBSTRING(@word,2,charindex(' ', @word)-2)) + ' ' + 
upper(left(substring(@word,charindex(' ', @word)+1,len(@word)-1),1)) 
+ lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word))) 
end

答案 2 :(得分:0)

尝试此查询是否有效。但是,如果您有多个'',则此查询将失败。

declare @word as nvarchar (20)

set @word = 'alex' -- 'victOR aALEXander'

select 
upper(left(@word, 1)) + 
CASE WHEN charindex(' ', @word)>0 THEN  lower(SUBSTRING(@word,2,charindex(' ', @word)-2)) + ' '
+ upper(left(substring(@word,charindex(' ', @word)+1,len(@word)-1),1)) 
+ lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word)))
 ELSE lower(SUBSTRING(@word,2,len(@word)-1)) END  

答案 3 :(得分:0)

尝试此功能:

Create Function dbo.Proper(@Data VarChar(8000))
Returns VarChar(8000)
As
Begin
  Declare @Position Int

  Select @Data = Stuff(Lower(@Data), 1, 1, Upper(Left(@Data, 1))),
         @Position = PatIndex('%[^a-zA-Z][a-z]%', @Data COLLATE Latin1_General_Bin)

  While @Position > 0
    Select @Data = Stuff(@Data, @Position, 2, Upper(SubString(@Data, @Position, 2))),
           @Position = PatIndex('%[^a-zA-Z][a-z]%', @Data COLLATE Latin1_General_Bin)

  Return @Data
End

无论数据中是否有空格,撇号或其他任何内容,此函数都能正常工作。不幸的是,它不会将麦当劳转换为麦克唐纳或奥布莱恩转为奥布莱恩。但是,它适用于任何只有1个大写字母的单词。