今天在論壇上看到一個問題,如下:

 
解決這個問題,Insus.NET寫了一個函數,可以方便以后的擴展,如果數值出現TB或是或更高時,可以只改這個函數即可。
復制代碼 代碼如下:
 
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]) 
 
執行結果:
