FileTable 建立在 FILESTREAM 之上,將檔案系統目錄結構映射為資料表,讓 T-SQL 也能操作檔案屬性、階層、全文搜尋,並透過 SMB 共享直接以 Windows 檔案總管存取。
file_stream (VARBINARY MAX FILESTREAM)、stream_id (GUID)、path_locator、parent_path_locator 維護階層。-- 1. 執行個體層級啟用 FILESTREAM (2 = T-SQL + Win32 流存取)
EXEC sp_configure 'filestream_access_level', 2; RECONFIGURE;
-- 2. 資料庫層級設定非交易存取目錄名
ALTER DATABASE test SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = 'test');
-- 3. 新增 FILESTREAM 檔案群組與檔案
ALTER DATABASE test ADD FILEGROUP fg_fs CONTAINS FILESTREAM;
ALTER DATABASE test ADD FILE (NAME = 'fg1', FILENAME = 'D:\FileStream\fg1') TO FILEGROUP fg_fs;
-- 4. 建立 FileTable
CREATE TABLE DocumentStore AS FileTable
WITH (FileTable_Directory = 'DocumentTable', FileTable_Collate_Filename = database_default);
-- 5. 插入目錄
INSERT INTO dbo.DocumentStore (name, is_directory) VALUES ('MyDir01', 1);
-- 6. 在目錄下插入檔案(需手動計算 path_locator 階層編碼)
DECLARE @path HIERARCHYID, @new_path HIERARCHYID;
SELECT @path = path_locator FROM dbo.DocumentStore WHERE name = 'MyDir01';
SET @new_path = @path.GetDescendant(NULL, NULL); -- 簡化:實務用 GetDescendant 產生子節點
INSERT INTO dbo.DocumentStore (name, file_stream, path_locator)
VALUES (N'空檔案.txt', 0x, @new_path);
啟用後,檔案總管輸入 \\server\MSSQLSERVER\test\DocumentTable 即可像操作一般資料夾般新增/刪除/修改檔案,變更即時反映在資料表。
FileTable 打通關係型與檔案系統兩世界,是非結構化資料管理的利器。