- 爱易网页
-
MSSQL教程
- sqlserver自定义函数时遇到很奇怪的有关问题
日期: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