IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[p_writeTextFile]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[p_writeTextFile];
GO
CREATE PROCEDURE p_writeTextFile
@filename VARCHAR(1000), -- 完整路徑
@text VARCHAR(8000) -- 寫入內容
AS
BEGIN
SET NOCOUNT ON;
DECLARE @obj INT, @err INT, @src VARCHAR(255), @desc VARCHAR(255);
-- 1. 建立 FileSystemObject
EXEC @err = sp_OACreate 'Scripting.FileSystemObject', @obj OUT;
IF @err <> 0 GOTO ErrorHandler;
-- 2. 開啟檔案 (8=Append, 1=Create if not exist)
EXEC @err = sp_OAMethod @obj, 'OpenTextFile', @obj OUT, @filename, 8, 1;
IF @err <> 0 GOTO ErrorHandler;
-- 3. 寫入一行
EXEC @err = sp_OAMethod @obj, 'WriteLine', NULL, @text;
IF @err <> 0 GOTO ErrorHandler;
-- 4. 釋放物件
EXEC @err = sp_OADestroy @obj;
RETURN;
ErrorHandler:
EXEC sp_OAGetErrorInfo @obj, @src OUT, @desc OUT;
SELECT CAST(@err AS VARBINARY(4)) AS ErrorCode, @src AS ErrorSource, @desc AS ErrorDesc;
EXEC sp_OADestroy @obj;
END
GO
EXEC p_writeTextFile 'C:\logs\app.log', '測試寫入 ' + CONVERT(VARCHAR, GETDATE(), 120);
| 方法 | 參數 | 說明 |
|---|---|---|
| OpenTextFile | 8 | ForAppending (附加模式) |
| 1 | Create if not exist (檔案不存在則建立) | |
| WriteLine | 字串 | 自動附加換行符 |
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;xp_cmdshell + echo、CLR 預存程序或外部 ETL 工具,效能與穩定性較佳。採用 GOTO ErrorHandler 集中處理,確保 sp_OADestroy 一定被呼叫,避免 COM 物件洩漏導致記憶體耗盡。