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)))

関数は、渡す文字列値に複数のコンマが存在することを前提として機能しています。ただし、コンマが1つしかない場合、の値は@jゼロになり-1、都市の長さとしてaを使用しようとすると、エラーがスローされて失敗します。

使用するデモを使用してSQLフィドルを作成しました。アドレスを使用する'1234 S.Alameda way,LA,CA12345'と、関数が機能します。

ただし、値を変更する '1234 S.Alameda way,LACA12345'と失敗します

SQLFiddleデモを参照してください

関数に渡す必要のあるすべての値の形式がどうなるか知っていますか?この形式が1から2、さらには3つのコンマに変更される場合は、期待どおりに機能しないため、この関数の記述方法を再考する必要があると思います。

于 2012-11-08T22:01:32.400 に答える