[MSSQL] 용량 사이즈 (KB, MB, GB, TB 등등) 포멧 단위변환 FUNCTION

첨부파일 용량을 데이터베이스에 사이즈 (int)로 저장한 경우 킬로바이트, 바이트, 메가바이트, 기가바이트 등 단위변환하여 SELECT 하는 함수입니다.

  1. CREATE FUNCTION [dbo].[udf_FormatBytes]
  2. (
  3. @InputNumber DECIMAL(38,7),
  4. @InputUOM VARCHAR(5) = 'Bytes'
  5. )
  6. RETURNS VARCHAR(20)
  7. WITH SCHEMABINDING
  8. AS
  9. BEGIN
  10. -- Declare the return variable here
  11. DECLARE @Output VARCHAR(48)
  12. DECLARE @Prefix MONEY
  13. DECLARE @Suffix VARCHAR(6)
  14. DECLARE @Multiplier DECIMAL(38,2)
  15. DECLARE @Bytes DECIMAL(38,2)
  16. SELECT @Multiplier =
  17. CASE @InputUOM
  18. WHEN 'Bytes' THEN 1
  19. WHEN 'Byte' THEN 1
  20. WHEN 'B' THEN 1
  21. WHEN 'Kilobytes' THEN 1024
  22. WHEN 'Kilobyte' THEN 1024
  23. WHEN 'KB' THEN 1024
  24. WHEN 'Megabytes' THEN 1048576
  25. WHEN 'Megabyte' THEN 1048576
  26. WHEN 'MB' THEN 1048576
  27. WHEN 'Gigabytes' THEN 1073741824
  28. WHEN 'Gigabyte' THEN 1073741824
  29. WHEN 'GB' THEN 1073741824
  30. WHEN 'Terabytes' THEN 1099511627776
  31. WHEN 'Terabyte' THEN 1099511627776
  32. WHEN 'TB' THEN 1099511627776
  33. WHEN 'Petabytes' THEN 1125899906842624
  34. WHEN 'Petabyte' THEN 1125899906842624
  35. WHEN 'PB' THEN 1125899906842624
  36. WHEN 'Exabytes' THEN 1152921504606846976
  37. WHEN 'Exabyte' THEN 1152921504606846976
  38. WHEN 'EB' THEN 1152921504606846976
  39. WHEN 'Zettabytes' THEN 1180591620717411303424
  40. WHEN 'Zettabyte' THEN 1180591620717411303424
  41. WHEN 'ZB' THEN 1180591620717411303424
  42. WHEN 'Yottabytes' THEN 1208925819614629174706176
  43. WHEN 'Yottabyte' THEN 1208925819614629174706176
  44. WHEN 'YB' THEN 1208925819614629174706176
  45. WHEN 'Brontobytes' THEN 1237940039285380274899124224
  46. WHEN 'Brontobyte' THEN 1237940039285380274899124224
  47. WHEN 'BB' THEN 1237940039285380274899124224
  48. WHEN 'Geopbytes' THEN 1267650600228229401496703205376
  49. WHEN 'Geopbyte' THEN 1267650600228229401496703205376
  50. END
  51. SELECT @Bytes = @InputNumber*@Multiplier
  52. SELECT @Prefix =
  53. CASE
  54. WHEN ABS(@Bytes) < 1024 THEN @Bytes --bytes
  55. WHEN ABS(@Bytes) < 1048576 THEN (@Bytes/1024) --kb
  56. WHEN ABS(@Bytes) < 1073741824 THEN (@Bytes/1048576) --mb
  57. WHEN ABS(@Bytes) < 1099511627776 THEN (@Bytes/1073741824) --gb
  58. WHEN ABS(@Bytes) < 1125899906842624 THEN (@Bytes/1099511627776) --tb
  59. WHEN ABS(@Bytes) < 1152921504606846976 THEN (@Bytes/1125899906842624) --pb
  60. WHEN ABS(@Bytes) < 1180591620717411303424 THEN (@Bytes/1152921504606846976) --eb
  61. WHEN ABS(@Bytes) < 1208925819614629174706176 THEN (@Bytes/1180591620717411303424) --zb
  62. WHEN ABS(@Bytes) < 1237940039285380274899124224 THEN (@Bytes/1208925819614629174706176) --yb
  63. WHEN ABS(@Bytes) < 1267650600228229401496703205376 THEN (@Bytes/1237940039285380274899124224) --bb
  64. ELSE (@Bytes/1267650600228229401496703205376) --geopbytes
  65. END,
  66. @Suffix =
  67. CASE
  68. WHEN ABS(@Bytes) < 1024 THEN ' Bytes'
  69. WHEN ABS(@Bytes) < 1048576 THEN ' KB'
  70. WHEN ABS(@Bytes) < 1073741824 THEN ' MB'
  71. WHEN ABS(@Bytes) < 1099511627776 THEN ' GB'
  72. WHEN ABS(@Bytes) < 1125899906842624 THEN ' TB'
  73. WHEN ABS(@Bytes) < 1152921504606846976 THEN ' PB'
  74. WHEN ABS(@Bytes) < 1180591620717411303424 THEN ' EB'
  75. WHEN ABS(@Bytes) < 1208925819614629174706176 THEN ' ZB'
  76. WHEN ABS(@Bytes) < 1237940039285380274899124224 THEN ' YB'
  77. WHEN ABS(@Bytes) < 1267650600228229401496703205376 THEN ' BB'
  78. ELSE ' Geopbytes'
  79. END
  80. -- Return the result of the function
  81. SELECT @Output = CAST(@Prefix AS VARCHAR(39)) + @Suffix
  82. RETURN @Output
  83. END
  84. GO


함수를 만드셔서 사용하셔도 되며 간단하게 사용할 때에는 아래 예시와 같이 사용하시면 됩니다.

사이즈가 큰 경우 bigint로 치환하여 사용해야 합니다.

  1. select convert(nvarchar(50), SUM(Convert(bigint, 컬럼명)) / 1073741824.0 ) + 'GB' as FSize
  2. 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
tinyint0 ~ 2551 byte




* 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
작성자 소개
초이 프로필
WrapUp 블로거

초이

반려견을 좋아하고, 차를 좋아하고, 여행을 좋아하고, 맛집을 찾아 즐기는 웹 개발자 입니다^^