【问题标题】:Invalid length parameter passed to the SUBSTRING function传递给 SUBSTRING 函数的长度参数无效
【发布时间】:2014-03-07 17:28:34
【问题描述】:

我已经编写了查询并且它正在运行:

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 函数的长度参数无效

为什么?

【问题讨论】:

标签: tsql


【解决方案1】:

试试这个功能:

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

无论您的数据中是否存在空格、撇号或其他任何内容,此功能都能正常工作。不幸的是,它不会将 macdonald 转换为 MacDonald 或将 o'brien 转换为 O'Brien。但是,它适用于任何只有 1 个大写字母的单词。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        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  
        

        【讨论】:

          猜你喜欢
          • 2014-03-01
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多