[MSSQL] 용량 사이즈 (KB, MB, GB, TB 등등) 포멧 단위변환 FUNCTION
첨부파일 용량을 데이터베이스에 사이즈 (int)로 저장한 경우 킬로바이트, 바이트, 메가바이트, 기가바이트 등 단위변환하여 SELECT 하는 함수입니다.
CREATE FUNCTION [dbo].[udf_FormatBytes]
(
@InputNumber DECIMAL(38,7),
@InputUOM VARCHAR(5) = 'Bytes'
)
RETURNS VARCHAR(20)
WITH SCHEMABINDING
AS
BEGIN
-- Declare the return variable here
DECLARE @Output VARCHAR(48)
DECLARE @Prefix MONEY
DECLARE @Suffix VARCHAR(6)
DECLARE @Multiplier DECIMAL(38,2)
DECLARE @Bytes DECIMAL(38,2)
SELECT @Multiplier =
CASE @InputUOM
WHEN 'Bytes' THEN 1
WHEN 'Byte' THEN 1
WHEN 'B' THEN 1
WHEN 'Kilobytes' THEN 1024
WHEN 'Kilobyte' THEN 1024
WHEN 'KB' THEN 1024
WHEN 'Megabytes' THEN 1048576
WHEN 'Megabyte' THEN 1048576
WHEN 'MB' THEN 1048576
WHEN 'Gigabytes' THEN 1073741824
WHEN 'Gigabyte' THEN 1073741824
WHEN 'GB' THEN 1073741824
WHEN 'Terabytes' THEN 1099511627776
WHEN 'Terabyte' THEN 1099511627776
WHEN 'TB' THEN 1099511627776
WHEN 'Petabytes' THEN 1125899906842624
WHEN 'Petabyte' THEN 1125899906842624
WHEN 'PB' THEN 1125899906842624
WHEN 'Exabytes' THEN 1152921504606846976
WHEN 'Exabyte' THEN 1152921504606846976
WHEN 'EB' THEN 1152921504606846976
WHEN 'Zettabytes' THEN 1180591620717411303424
WHEN 'Zettabyte' THEN 1180591620717411303424
WHEN 'ZB' THEN 1180591620717411303424
WHEN 'Yottabytes' THEN 1208925819614629174706176
WHEN 'Yottabyte' THEN 1208925819614629174706176
WHEN 'YB' THEN 1208925819614629174706176
WHEN 'Brontobytes' THEN 1237940039285380274899124224
WHEN 'Brontobyte' THEN 1237940039285380274899124224
WHEN 'BB' THEN 1237940039285380274899124224
WHEN 'Geopbytes' THEN 1267650600228229401496703205376
WHEN 'Geopbyte' THEN 1267650600228229401496703205376
END
SELECT @Bytes = @InputNumber*@Multiplier
SELECT @Prefix =
CASE
WHEN ABS(@Bytes) < 1024 THEN @Bytes --bytes
WHEN ABS(@Bytes) < 1048576 THEN (@Bytes/1024) --kb
WHEN ABS(@Bytes) < 1073741824 THEN (@Bytes/1048576) --mb
WHEN ABS(@Bytes) < 1099511627776 THEN (@Bytes/1073741824) --gb
WHEN ABS(@Bytes) < 1125899906842624 THEN (@Bytes/1099511627776) --tb
WHEN ABS(@Bytes) < 1152921504606846976 THEN (@Bytes/1125899906842624) --pb
WHEN ABS(@Bytes) < 1180591620717411303424 THEN (@Bytes/1152921504606846976) --eb
WHEN ABS(@Bytes) < 1208925819614629174706176 THEN (@Bytes/1180591620717411303424) --zb
WHEN ABS(@Bytes) < 1237940039285380274899124224 THEN (@Bytes/1208925819614629174706176) --yb
WHEN ABS(@Bytes) < 1267650600228229401496703205376 THEN (@Bytes/1237940039285380274899124224) --bb
ELSE (@Bytes/1267650600228229401496703205376) --geopbytes
END,
@Suffix =
CASE
WHEN ABS(@Bytes) < 1024 THEN ' Bytes'
WHEN ABS(@Bytes) < 1048576 THEN ' KB'
WHEN ABS(@Bytes) < 1073741824 THEN ' MB'
WHEN ABS(@Bytes) < 1099511627776 THEN ' GB'
WHEN ABS(@Bytes) < 1125899906842624 THEN ' TB'
WHEN ABS(@Bytes) < 1152921504606846976 THEN ' PB'
WHEN ABS(@Bytes) < 1180591620717411303424 THEN ' EB'
WHEN ABS(@Bytes) < 1208925819614629174706176 THEN ' ZB'
WHEN ABS(@Bytes) < 1237940039285380274899124224 THEN ' YB'
WHEN ABS(@Bytes) < 1267650600228229401496703205376 THEN ' BB'
ELSE ' Geopbytes'
END
-- Return the result of the function
SELECT @Output = CAST(@Prefix AS VARCHAR(39)) + @Suffix
RETURN @Output
END
GO
함수를 만드셔서 사용하셔도 되며 간단하게 사용할 때에는 아래 예시와 같이 사용하시면 됩니다.
사이즈가 큰 경우 bigint로 치환하여 사용해야 합니다.
select convert(nvarchar(50), SUM(Convert(bigint, 컬럼명)) / 1073741824.0 ) + 'GB' as FSize
FROM 테이블명
bigint로 사용하지 않을 경우 아래와 같은 오류 메세지가 발생합니다.
"expression을(를) 데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다."
[참고] 데이터 형식에 따른 범위
데이터 형식 | 범위 | 저장소 |
bigint | -2^63(-9,223,372,036,854,775,808) ~ 2^63-1(9,223,372,036,854,775,807) | 8 byte |
int | -2^31(-2,147,483,648) ~ 2^31-1(2,147,483,647) | 4 byte |
smallint | -2^15(-32,768) ~ 2^15-1(32,767) | 2 byte |
tinyint | 0 ~ 255 | 1 byte |