字串欄位儲存 '23.5MB', '10GB', '12.7MB', '8GB',直接 ORDER BY Size 會按字元序排序 (10GB 排在 23.5MB 前),不符合實際大小。
CREATE FUNCTION dbo.udf_OrderLimitSize(@val NVARCHAR(30))
RETURNS DECIMAL(18,6)
AS BEGIN
IF LEN(@val) <= 2 RETURN NULL;
DECLARE @num DECIMAL(18,6), @bytes DECIMAL(18,6);
IF RIGHT(@val,2) NOT IN ('TB','GB','MB','KB') RETURN NULL;
SET @num = CONVERT(DECIMAL(18,6), LEFT(@val, LEN(@val)-2));
IF ISNUMERIC(@num) = 0 RETURN NULL;
IF @val LIKE '%TB' SET @bytes = @num * 1024 * 1024 * 1024;
ELSE IF @val LIKE '%GB' SET @bytes = @num * 1024 * 1024;
ELSE IF @val LIKE '%MB' SET @bytes = @num * 1024;
ELSE IF @val LIKE '%KB' SET @bytes = @num;
RETURN @bytes;
END
GO
CREATE TABLE #t (Id INT IDENTITY, Size NVARCHAR(50));
INSERT #t VALUES ('23.5MB'),('10GB'),('12.7MB'),('8GB');
SELECT Id, Size FROM #t ORDER BY dbo.udf_OrderLimitSize(Size);
-- 結果: 12.7MB, 23.5MB, 8GB, 10GB
未來新增 PB、EB 單位,只需在函數內增加對應 IF 區塊,呼叫端 SQL 無需修改。