日期:2014-05-17  浏览次数:20588 次

【大神解惑】关于sql自定义函数、自定义数据类型
各位大神,小白我在sql里自定义了一个函数,用来达到这样的效果,
select dbo. sj_dis(12345)时显示结果为12300,select dbo. sj_dis(1234)时显示结果为1230,select dbo. sj_dis(123)时显示结果为123,,select dbo. sj_dis(12.34)时显示结果为12.3,这里面返回的这个值既有小数又有整数,所以我定义的返回类型是varchar,但是目前的问题是,当我查询select dbo. sj_dis(12.00)时,查询到的结果是12,可是我需要的结果是12.0,需求解答!!附代码如下。另外我想问一下,能否自定义一个数据类型,在大于100的时候,该数据类型是int,小于100时,该数据类型是float?

create    function sj_dis(@d varchar(50))
returns varchar(50)
begin
declare @tem float
set @tem=cast(@d as float)
if @tem between 10000 and 100000
set @tem=round(@tem/100,0)*100

if @tem between 1000 and 10000
set @tem=round(@tem/10,0)*10

if @tem between 100 and 1000
set @tem=@tem

if @tem between 10 and 100
set @tem=round(@tem,1)

return @tem
end

------解决方案--------------------
引用:
引用:
JScript code

return sql_variant

大神,我需要
(1)select dbo. sj_dis(12345)时显示结果为12300
(2)select dbo. sj_dis(12.00)时,查询到的结果是12.0

改成return sql_variant后查询第一个结果是12300.00,这个不对啊,不是12300啊
……


return case when ?

create function abc(@d float,@m int) -- @m=0舍入!=0截断
returns sql_variant
begin
declare @e int = log10(@d)
declare @v float = round(@d,2-@e,@m)
if @v>=100 return convert(int,@v)
if @v>=10 return convert(dec(3,1),@v)
return convert(dec(3,2),@v)
end
go

select dbo.abc(987654321,0) union all
select dbo.abc(987654321,1) union all
select dbo.abc(12345,0) union all
select dbo.abc(1234,0) union all
select dbo.abc(123.45,0) union all
select dbo.abc(12.345,0) union all
select dbo.abc(12.00,0) union all
select dbo.abc(1.2345,0) union all
select dbo.abc(99.99,0) union all
select dbo.abc(99.99,1)

/*
988000000
987000000
12300
1230
123
12.3
12.0
1.23
100
99.9
*/