需求:對使用者上傳的 Office/PDF/文字等檔案內容進行全文檢索。方案:**檔案系統儲存 + Windows Indexing Service (索引服務) 建立全文索引 + SQL Server 連結伺服器查詢索引目錄**。優勢:資料庫不儲存二進位內容,備份/還原輕量,檔案系統原生支援海量檔案。
EXEC sp_addlinkedserver
@server = N'DCS', -- 連結伺服器名稱 (查詢時使用)
@srvproduct = N'Index Server', -- 固定產品名
@provider = N'MSIDXS', -- 索引服務 OLE DB Provider
@datasrc = N'DCSII'; -- 索引服務類別目錄名稱
GO
-- 基礎查詢:搜尋包含 "番號" 和 "abc" 的檔案
SELECT Q.*
FROM OPENQUERY(DCS,
'SELECT FileName, Size, DocAuthor, Path
FROM SCOPE()
WHERE CONTAINS('' "番號" AND "abc" '')'
) AS Q;
因 `OPENQUERY` 不接受變數,需在應用程式 (C#/Java/PHP) 組裝完整 SQL 字串後執行:
// C# 範例
string keywords = "番號 AND abc"; // 經過清洗/轉義
string sql = $@"
SELECT Q.FileName, Q.Path, Q.Rank
FROM OPENQUERY(DCS,
'SELECT FileName, Path, Rank FROM SCOPE() WHERE CONTAINS(""{keywords}"")'
) AS Q
ORDER BY Q.Rank DESC";
// 參數化無效,務必嚴格清洗 keywords 移除單引號、分號等注入風險字元
| 維度 | Windows 索引服務 + 連結伺服器 | SQL Server Full-Text Search (FTS) |
|---|---|---|
| 資料儲存 | 檔案系統 (資料庫僅存路徑/中繼資料) | 資料庫 `varbinary(max)` / `FILESTREAM` / `FileTable` |
| 備份/還原 | 資料庫極小、快速;檔案系統獨立備份 | 資料庫備份包含全文索引 (2005+),但檔案大 |
| 索引效能 | 依賴系統資源,大量檔案初始索引慢 | 資料庫引擎整合,平行索引、增量填滿 |
| 查詢整合 | 原生 `CONTAINS`/`FREETEXT`/`CONTAINSTABLE`,無縫整合查詢計畫 | |
| IFilter 支援 | 系統級註冊,通用性強 | 同樣使用系統 IFilter,需在 SQL 註冊 |
| 適用場景 | 既有檔案系統、跨伺服器檔案、資料庫極小化需求 | **新專案首選**,資料與索引一致性強、查詢效能優、管理整合 |
若環境允許升級,**強烈建議採用 `FileTable` (非交易式檔案命名空間) + 全文檢索**:
Windows 索引服務 + 連結伺服器是 **SQL Server 2000/2005 時代的經典權宜方案**,解決了資料庫不存二進位、備份輕量的問題。但受限於 `OPENQUERY` 無法參數化、跨伺服器查詢效能、管理割裂等缺陷,**新專案請優先採用 SQL Server 內建全文檢索 (FTS) 或 FileTable**,獲得原生整合、一致性與效能優勢。