正解SQLSEVER 2005 sql排序

本文介绍了一个由Insus.NET编写的函数udf_OrderLimitSize,用于处理和转换数据大小单位,如从MB转换为TB。通过此函数,用户可以在不修改大量代码的情况下轻松调整数据大小单位的计算方式。

今天在论坛上看到一个问题,如下:

 

解决这个问题,Insus.NET写了一个函数,可以方便以后的扩展,如果数值出现TB或是或更高时,可以只改这个函数即可。

ExpandedBlockStart.gif udf_OrderLimitSize
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
ALTER   FUNCTION   [ dbo ] . [ udf_OrderLimitSize ]
(
    
@Ov   NVARCHAR ( 30 )
)
RETURNS   decimal ( 18 , 6 )
AS
BEGIN

-- 如果长度少于等于2的数值为返回NULL
IF  ( LEN ( @Ov <=   2 )
    
RETURN   NULL

-- 宣告两个变量
DECLARE   @v   DECIMAL ( 18 , 6 ), @n   DECIMAL ( 18 , 6 )


-- 判断最后两位数是否为下面这些单位
IF  ( RIGHT ( @Ov , 2 NOT   IN  ( ' TB ' , ' GB ' , ' MB ' , ' KB ' ))
    
RETURN   NULL

-- 去掉最后两位数之后,把值转为DECIMAL数据类型    
SET   @n   =   CONVERT ( DECIMAL ( 18 , 6 ), LEFT ( @Ov LEN ( @Ov -   2 ))

-- 判断截除最后两位数之后,使用ISNUMERIC判断是否为有效的数值,如果不是返回NULL
IF  ( ISNUMERIC ( @n =   0 )
    
RETURN   NULL
    
-- 下面做单位转算,如果遇上有新单位时,可以作相应添加
IF  ( @Ov   LIKE   ' %TB ' )
    
SET   @v   =   @n   *   1024   *   1024   *   1024
IF  ( @Ov   LIKE   ' %GB ' )
    
SET   @v   =   @n   *   1024   *   1024
IF  ( @Ov   LIKE   ' %MB ' )    
    
SET   @v   =   @n   *   1024  
IF  ( @Ov   LIKE   ' %KB ' )    
    
SET   @v   =   @n
    
RETURN   @v
END

 

下面为了应用这个函数,例举例子:

CREATE   TABLE  test(id  int   identity ( 1 , 1 ),size  NVARCHAR ( 50 ))
GO
INSERT   INTO   [ test ]   values ( ' 23.5mb ' ),( ' 10gb ' ),( ' 12.7mb ' ),( ' 8GB ' )
go
SELECT   [ id ] , [ size ]   FROM  test  ORDER   BY   [ dbo ] . [ udf_OrderLimitSize ] ( [ size ] )

 

执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值