FileStream 將 varbinary(max) 二進位大物件 (BLOB) 儲存於 NTFS 檔案系統,而非資料庫資料檔,突破 2 GB 上限,利用檔案系統快取與串流 API,適合影像、文件、影音等大型非結構化資料。
EXEC sp_configure 'filestream_access_level', 2; -- 0=關閉, 1=T-SQL, 2=完整
RECONFIGURE;
CREATE DATABASE [FileStreamDB]
ON PRIMARY
( NAME = N'FileStreamDB_data', FILENAME = N'D:\Data\FileStreamDB_data.mdf' ),
FILEGROUP [FSGroup] CONTAINS FILESTREAM
( NAME = N'FSGroup_data', FILENAME = N'D:\Data\FSGroup' ) -- 目錄而非檔案
LOG ON
( NAME = N'FileStreamDB_log', FILENAME = N'D:\Log\FileStreamDB_log.ldf' );
ALTER DATABASE [FileStreamDB]
ADD FILEGROUP [FSGroup2] CONTAINS FILESTREAM;
GO
ALTER DATABASE [FileStreamDB]
ADD FILE
( NAME = N'FSGroup2_data', FILENAME = N'D:\Data\FSGroup2' )
TO FILEGROUP [FSGroup2];
GO
CREATE TABLE [dbo].[Documents]
(
[Id] INT IDENTITY PRIMARY KEY,
[RowGuid] UNIQUEIDENTIFIER NOT NULL UNIQUE ROWGUIDCOL DEFAULT NEWID(),
[FileData] VARBINARY(MAX) FILESTREAM NULL,
[FileName] NVARCHAR(255),
[UploadTime] DATETIME2 DEFAULT SYSUTCDATETIME()
);
-- 必須條件:
-- 1. 有 ROWGUIDCOL 的 UNIQUEIDENTIFIER NOT NULL UNIQUE 欄位
-- 2. VARBINARY(MAX) 欄位標記 FILESTREAM
INSERT INTO [dbo].[Documents] (FileName, FileData)
VALUES ('test.pdf', 0x00); -- 實際開發用參數化 @FileData
SELECT FileData.PathName() AS FilePath,
GET_FILESTREAM_TRANSACTION_CONTEXT() AS TxnContext
FROM [dbo].[Documents]
WHERE Id = 1;
BACKUP DATABASE 即可完整備份,無需額外複製檔案目錄。FileStream 以最小程式碼變更即可獲得檔案系統級效能與無上限儲存,關鍵在於啟用層級設定、建立 CONTAINS FILESTREAM 檔案群組、資料表滿足 ROWGUIDCOL 條件。配合 SqlFileStream 類別 (ADO.NET) 可實作高效能串流上傳/下載。