日期:2014-05-18  浏览次数:20590 次

sqlserver自定义函数时遇到很奇怪的问题!
编写一个四舍六入函数   ,5后一位没有数字时且其前一位是偶数时不进,其余情况四舍五入。   例子如下:(保留一位小数)
如1.25-〉1.2
1.250-〉1.3
1.15-〉1.2
1.150-〉1.2
在   sqlserver2000的查询分析器里实现没有问题,编成自定义函数却出现问题。
////
  declare   @str   varchar(20)           /*转换成字符类型*/
          declare   @str20   varchar(20)           /*小数位数后面的字符串*/
        declare   @temp   varchar(20)  
declare   @i   int
declare   @temp0   varchar(20)  
declare   @temp1   varchar(20)          
        set   @str   =   '1.25 '
        set   @i=1
        set   @str20=substring(@str,charindex( '. ',@str)   +   1,len(@str))
set   @temp=substring(@str20,@i+1,1)
set   @temp0=substring(@str20,@i,1)
set   @temp1=substring(@str20,@i+2,1)
          if   len(@str20) <@i
begin  
        set   @str=   @str+replicate( '0 ',@i-len   (substring(@str,charindex( '. ',@str)+1,len(@str))))
  end

else   if((@temp1= ' ')and   (convert(int,@temp)=5)   and   (convert(int,@temp0)%2=0)   )
begin
set   @str=substring(@str,1,charindex( '. ',@str)   +@i)  
end
  else
begin         /*否则四舍五入*/
    set   @str   =   convert(varchar,round(convert(float,@str),@i))
end
  select   @str
当str赋值1.25时结果为1.2
                  1.250时结果为1.3
均正确
相同的代码编成自定义函数:
CREATE   function   tttRound(@num   float,@i   int)
returns   float
as
begin
        declare   @str   varchar(20)           /*转换成字符类型*/
          declare   @str20   varchar(20)           /*小数位数后面的字符串*/
        declare   @temp   varchar(20)  
declare   @temp0   varchar(20)  
declare   @temp1   varchar(20)           /*小数位数字符串*/
        set   @str   =   convert(varchar,@num)
        set   @str20=substring(@str,charindex( '. ',@str)   +   1,len(@str))
set   @temp=substring(@str20,@i+1,1)
set   @temp0=substring(@str20,@i,1)
set   @temp1=substring(@str20,@i+2,1)
          if   len(@str20) <@i
begin  
        set   @str=   @str+replicate( '0 ',@i-len   (substring(@str,charindex( '. ',@str)+1,len(@str))))
  end

else     if((@temp1= ' ')and   (convert(int,@temp)=5)   and   (convert(int,@temp0)%2=0)   )
begin
set   @str=substring(@str,1,charindex( '. ',@str)   +@i)  
end
  else
begin         /*否则四舍五入*/
    set   @str   =   convert(varchar,round(@num,@i))
end

RETURN   @str
  end
 
select   dbo.tttRound(1.25,1)   结果1.2

select   dbo.tttRound(1.250,1)结果竟然也是1.2