SQL 小数位保留,如果不够保留位数,自动添加0
if OBJECT_ID('GetDecimal') is not nulldrop function GetDecimalgocreate function [dbo].[GetDecimal](@value varchar(20), --处理的值@decimalPlace int --小数位 ) returns varchar(20)as /***************************************--功能:小数位保留 如果保留的小数位是0,自动查找非0数字--创建人:zhujt--创建日期:2012-11-22 10:11:09***************************************/begindeclare @result varchar(20) --显示结果 if @value is not nullbegin--处理的值含有'L'if charindex('L',@value)>0set @result=cast(convert(decimal(18,8),replace(@value,'L',''))/2 as varchar)--处理的值含有'e'else if charindex('e',@value)>0 or charindex('E',@value)>0set @result=cast(convert(decimal(18,8),convert(float,@value)) as varchar)else set @result=@valuedeclare @index int,--小数点位置 @integerPart varchar(10),--整数部分@decimalPart varchar(10)--小数部分--小数点位置 set @index=charindex('.',@result)--处理的值带有小数if @index>0begin--获取整数部分set @integerPart=substring(@result,1,@index)--获取小数部分set @decimalPart=substring(@result,@index+1,len(@result)-@index)--如果小数部分长度大于保留小数位数if len(@decimalPart)>@decimalPlace begindeclare @savePard float --保留部分 set @savePard=convert(float,'0.'+substring(@decimalPart,1,@decimalPlace))if @savePard>0 --保留部分>0begin if convert(int,substring(@decimalPart,@decimalPlace+1,1))>=5 --如果下一位≥5begindeclare @k int=1, --下标@power float=1 --平方while @k<=@decimalPlacebeginset @power=@power*0.1set @k+=1endset @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@savePard+@power))) while charindex('.',@result)>0 and right(@result,1)='0' set @result=left(@result,len(@result)-1) if right(@result,1)='.' set @result=@result+'0'end else --如果<5set @result=@integerPart+@savePardif charindex('.',@result)=0begindeclare @m int=1set @result+='.'while @m<=@decimalPlacebeginset @result+='0'set @m+=1endendelse set @result=substring(@result,1,charindex('.',@result)+1+@decimalPlace)endelse if @savePard=0--保留部分=0begindeclare @intPos int=0, -->0的数的位置@next int, --下一位的值@n int=1, --循环变量@power1 float=1 --平方 while @intPos<=len(@decimalPart)beginset @intPos+=1if substring(@decimalPart,@intPos,1)<>'0' beginset @next=substring(@decimalPart,@intPos+1,1)breakendendset @savePard=convert(float,'0.'+substring(@decimalPart,1,@intPos))if @next>=5begin while @n<=@intPosbeginset @power1=@power1*0.1set @n+=1endset @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@savePard+@power1))) endelse set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),@savePard))while charindex('.',@result)>0 and right(@result,1)='0' set @result=left(@result,len(@result)-1) if right(@result,1)='.' set @result=@result+'0'endendelse if len(@decimalPart)<@decimalPlace --如果小数部分<保留小数位数begindeclare @j int=1 while @j<=@decimalPlace-len(@decimalPart)beginset @decimalPart+='0'set @j+=1endset @result=@integerPart+@decimalPartend endelse --如果没有小数位beginset @result+='.'declare @i int=1while @i<= @decimalPlace beginset @result+='0'set @i+=1endend endelse set @result=@valuereturn @resultend