补充一下:
CREATE FUNCTION wf_xorreturn(@as_source char(30))  
RETURNS  char(30)
AS  
BEGIN 
declare
@li_ifor integer, 
@li_len integer ,
@ls_return char(30),
@ls_pass char(30) ,
@ls_temp char(30),
@li_head integer,
@li_detail integer
set @ls_pass = '1234567890123456789'
set @ls_return = ''
IF ISNUMERIC(@as_source) = 0
begin
  return @as_source
end
set @li_len = len(@as_source)
set @li_ifor = 1
while @li_ifor<=@li_len
begin
 set @li_head = cast(SUBSTRING(@as_source,@li_ifor,1) as int) + cast(SUBSTRING(@ls_pass,@li_ifor,1) as int) 
select @ls_temp =   
case @li_head
when 10 then 'B'
when 11 then 'W'
when 12 then 'S'
when 13 then 'O'
when 14 then 'F'
when 15 then 'T'
when 16 then ';'
when 17 then '@'
when 18 then '$'
else cast(@li_head as char)
end  set @ls_return = @ls_return + @ls_temp
 set @li_ifor = @li_ifor + 1
endreturn @ls_returnEND

解决方案 »

  1.   

    @li_head 这个变量用的有问题,@li_head 定义为 integer
    但是后面还给赋 'A', 之类。
      

  2.   

    CREATE FUNCTION wf_xorreturn(@as_source char(30))  
    RETURNS  char(30) 把char都改成varchar吧
      

  3.   


    所有的char类型,全部改成varchar
      

  4.   

    set @li_head = cast(SUBSTRING(@as_source,@li_ifor,1) as int) + cast(SUBSTRING(@ls_pass,@li_ifor,1) as int) 
    如果传入的是abc这样的字符,你这里第一个cast就会报错。
      

  5.   

    @ls_return varchar(30), 
    @ls_pass varchar(30) , 
    @ls_temp varchar(30), 
    set @ls_return = rtrim(@ls_return) + rtrim(@ls_temp) 
      

  6.   

    char 改 varchar前后强制去空格
      

  7.   

    是空格的原因.换成varchar没问题