0

我昨天创建了以下函数,现在我遇到了一个错误:

传递给左侧或子字符串函数的长度参数无效

你们能看看我的功能吗?我真的很感激。

Create function nowFunctionNewadd
      (@fladd varchar(255))
returns  @tbl table(addr varchar(100), city varchar(100),
                    state varchar(100), Zip varchar(5)) 
as
begin
   declare @str varchar(100)
      ,@i int
      ,@j int
      ,@str2 varchar(100)
      ,@address varchar(100)
      ,@city varchar(100)
      ,@lastcomma int
      ,@lastPart varchar(100)
      ,@zipstart int
      ,@zip varchar(5) = ''

   select @str=rtrim(ltrim(@fladd))

   set @i = charindex(',', @str)
   set @str2=rtrim(ltrim(substring(@str, @i+1, 999)))
   set @j=CHARINDEX(',',@str2)

   set @lastcomma = len(@str) - charindex(',', reverse(@str)+',')
   set @lastPart = substring(@str, @lastcomma+2, 100)
   set @address = REPLACE(rtrim(ltrim(substring(@str,1,@i-1))),',','')
   set @zipstart = patindex('%[0-9]%', @lastpart)
   set @city=LTRIM(RTRIM(substring(@str, @i+1, @j-1)))

   If @zipstart > 0 
      select @zip = substring(@lastpart, @zipstart, 5), 
             @lastPart = rtrim(substring(@lastpart, 1, @zipstart-1))

   insert into @tbl(addr, city, state, Zip)
   values(@address, @city, @lastpart, @zip)

   return
end
4

1 回答 1

2

我可以从您的函数中看到的问题从这一行开始:

set @j=CHARINDEX(',',@str2)

然后我猜测这条线正在引发错误:

set @city=LTRIM(RTRIM(substring(@str, @i+1, @j-1)))

您的函数在您传递的字符串值中存在多个逗号的假设下工作。但是,如果您没有多个逗号,则 for 的值@j将为零,然后您尝试使用 a-1作为城市的长度,这将无法抛出您得到的错误。

我创建了一个带有演示的 SQL Fiddle。使用地址'1234 S.Alameda way,LA,CA12345'您的功能将起作用。

但是,如果您将值更改为 '1234 S.Alameda way,LACA12345'它将失败

请参阅SQL Fiddle 演示

你知道你需要传递给函数的所有值的格式是什么吗?如果此格式要从 1 变为 2 甚至 3 逗号,我认为您需要重新考虑如何编写此函数,因为它不会按预期工作。

于 2012-11-08T22:01:32.400 回答