本文列舉的存儲過程屬於 **未文件化、非官方支援** 物件。Microsoft 可在任何版本(含 Service Pack、累積更新)中**無預警變更行為或移除**。生產環境使用需自行評估風險,建議封裝於可替換的工具元件中。
| 存儲過程 | SQL 2000 | SQL 2005 | SQL 2008 | 主要功能 |
|---|---|---|---|---|
| sp_executeresultset | ✅ | ❌ 已移除 | ❌ | 動態 SQL 批次執行(已被 sp_executesql 取代) |
| sp_MSforeachdb | ✅ | ✅ | ✅ | 遍歷所有資料庫執行命令 |
| sp_MSforeachtable | ✅ | ✅ | ✅ | 遍歷當前資料庫所有表執行命令 |
| sp_readerrorlog / xp_readerrorlog | ✅ | ✅ | ✅ | 快速讀取錯誤日誌/代理日誌 |
| xp_create_subdir | ❌ | ✅ | ✅ | 建立目錄(含網路路徑) |
| xp_delete_file | ❌ | ✅ | ✅ | 刪除檔案(含網路路徑) |
| xp_dirtree | ✅ | ✅ | ✅ | 列出目錄樹/檔案,支援遞歸深度控制 |
| xp_fileexist | ✅ | ✅ | ✅ | 檢查檔案/目錄是否存在 |
| xp_fixeddrives | ✅ | ✅ | ✅ | 列出磁碟機與可用空間 |
| xp_getfiledetails | ✅ | ❌ 已移除 | ❌ | 取得檔案大小、時間、屬性(改用 CLR/xp_cmdshell) |
| xp_getnetname | ✅ | ✅ | ✅ | 取得實體機器網路名稱 |
| xp_loginconfig | ✅ | ✅ | ✅ | 顯示登入配置(認證模式、預設域、稽核等級) |
| xp_makecab / xp_unpackcab | ✅ | ❌ | ❌ | CAB 壓縮/解壓縮(已被 CLR/第三方取代) |
| xp_msver | ✅ | ✅ | ✅ | 系統/ SQL 版本、CPU、記憶體、授權等詳細資訊 |
| xp_get_mapi_profiles / xp_test_mapi_profile | ✅ | ✅ 需啟用 SQL Mail XPs | ✅ 需啟用 | SQL Mail 設定檔管理/測試(已棄用,改用 Database Mail) |
| xp_subdirs | ✅ | ✅ | ✅ | 列出子目錄(xp_dirtree 子集) |
EXEC sp_readerrorlog; -- 當前 SQL 錯誤日誌
EXEC sp_readerrorlog 0, 1; -- 當前 SQL 錯誤日誌 (明確參數)
EXEC sp_readerrorlog 1, 2; -- 前一個 SQL Agent 日誌
-- 列印所有資料庫名稱
EXEC sp_MSforeachdb 'PRINT ''?''';
-- 列印當前資料庫所有表名稱
EXEC sp_MSforeachtable 'PRINT ''?''';
-- 跨資料庫執行(SQL 2005+ 支援替換字元)
EXEC sp_MSforeachdb @command1='USE [?]; EXEC sp_MSforeachtable ''PRINT ''''?'''''';';
-- 建立目錄
EXEC xp_create_subdir 'C:\MSSQL\Backup\NewFolder';
-- 列出目錄樹(前 2 層含檔案)
EXEC xp_dirtree 'D:\MSSQL\', 2, 1;
-- 檢查檔案存在
DECLARE @exists INT;
EXEC xp_fileexist 'C:\Import\data.csv', @exists OUTPUT;
SELECT @exists; -- 1=存在, 0=不存在
-- 磁碟空間
EXEC xp_fixeddrives; -- 所有磁碟
EXEC xp_fixeddrives 2; -- 僅固定磁碟
EXEC xp_msver; -- 全部
EXEC xp_msver 'Platform', 'Comments'; -- 僅指定項目
| 風險 | 緩解措施 | 現代替代 |
|---|---|---|
| 版本升級失效 | 封裝於 PowerShell/SQLCLR 工具組件,升級時僅更新組件 | dbatools (PowerShell)、SMO、CLR 存儲過程 |
| 安全性:xp_cmdshell 等效風險 | 最小權限原則,僅 sysadmin 可執行;審計所有呼叫 | FileTable、FILESTREAM、外部存取組件 (EXTERNAL_ACCESS) |
| SQL Mail 組件已棄用 | 禁用 xp_get_mapi_profiles 等,遷移至 Database Mail | sp_send_dbmail (Database Mail) |
未文件化存儲過程是 DBA 「瑞士刀」——好用但需極度謹慎。**原則:能用官方功能/CLR/PowerShell 解決的,堅決不用未文件化物件。** 若必須使用,請建立內部文檔、版本相容性測試腳本與回滾預案。