SQL Server 2000 原生不支援資料列/頁面壓縮 (2008+ 才支援)。針對大量歷史資料 (如記錄檔、審計追蹤),可透過應用層壓縮或自建 CLR (2005+) 降低儲存成本。本文提供一個純 T-SQL 示範腳本,展示如何將大型文字欄位壓縮儲存至 `varbinary`/`image` 欄位。
注意: SQL 2000 內建無壓縮函數,實務上常搭配擴展預存程序 (如 `xp_zlib`、自製 C++ DLL) 或應用程式端 (C# `GZipStream`) 壓縮後寫入。以下腳本假設已註冊 `xp_compress` / `xp_decompress` 擴展程序。
CREATE TABLE LargeDataArchive (
ID INT IDENTITY(1,1) PRIMARY KEY,
OriginalSize INT NOT NULL,
CompressedData IMAGE NOT NULL, -- 或 VARBINARY(8000) 視版本而定
CreatedDate DATETIME DEFAULT GETDATE()
);
CREATE PROCEDURE usp_InsertCompressedData
@SourceText TEXT -- 或 NVARCHAR(MAX) 2005+
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Compressed VARBINARY(8000), @OrigSize INT;
-- 假設 xp_compress 為自訂擴展程序:EXEC xp_compress @input, @output OUTPUT
-- 此處為示意邏輯,實際需對應 DLL 介面
EXEC xp_compress @SourceText, @Compressed OUTPUT;
SET @OrigSize = DATALENGTH(@SourceText);
INSERT INTO LargeDataArchive (OriginalSize, CompressedData)
VALUES (@OrigSize, @Compressed);
END
CREATE FUNCTION fn_DecompressData (@CompressedData IMAGE)
RETURNS TEXT -- 或 NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result TEXT;
-- EXEC xp_decompress @CompressedData, @Result OUTPUT;
RETURN @Result;
END
現代架構建議將壓縮邏輯移至應用程式 (C# `System.IO.Compression.GZipStream`、Java `GZIPOutputStream`),優點:
原始碼片段為個人學習筆記 (作者:Stephenzhou,日期:2014.06.20),包含完整壓縮/解壓縮流程註解,歡迎同好交流優化細節。