核心系統預存程序
xp_fileexist:檢查檔案/目錄是否存在,回傳 @result (1=存在, 0=不存在)。
xp_cmdshell:執行作業系統命令 (需啟用)。
刪除檔案預存程序
CREATE PROC dbo.delFile_P (@path NVARCHAR(200))
AS
BEGIN
DECLARE @result INT;
EXEC master.dbo.xp_fileexist @path, @result OUT; -- 路徑可含空格
IF @result = 1
BEGIN
-- 路徑含空格時,用雙引號包裹
SET @path = 'del "' + REPLACE(@path, '"', '""') + '"';
EXEC master.dbo.xp_cmdshell @path;
END
END;
GO
-- 呼叫範例
EXEC dbo.delFile_P N'F:\Internet Explorer 6 綠色版\install.log';
啟用 xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
擴充:判斷資料夾是否存在
DECLARE @result INT;
EXEC master.dbo.xp_fileexist N'C:\Temp', @result OUT;
IF @result = 1 PRINT '資料夾存在'; -- xp_fileexist 同時支援檔案與目錄
安全性與最佳實務
xp_cmdshell 權限極高,僅限 sysadmin 使用,生產環境建議關閉。
- 若應用層需刪檔,優先在應用程式 (C#/PowerShell) 執行,避免資料庫層呼叫 Shell。
- 若必須在 T-SQL 刪檔,建議封裝為簽署憑證的模組,授予最低權限登入執行。
- 路徑含空格、特殊字元時,務必正確逸出 (上例用雙引號)。
現代替代方案 (SQL 2017+)
- 使用
sp_execute_external_script 呼叫 Python/R 刪檔,隔離權限。
- 或透過 CLR 預存程序 (需 `EXTERNAL_ACCESS` 權限組件)。