首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 取得 Excel 所有工作表名稱:使用 OLE Automation 物件

     編輯:關於SqlServer

實作函數

USE tempdb;
GO

IF OBJECT_ID('dbo.udf_getExcelTableNames') IS NOT NULL
    DROP FUNCTION dbo.udf_getExcelTableNames;
GO

CREATE FUNCTION dbo.udf_getExcelTableNames(@filename VARCHAR(1000))
RETURNS @t TABLE (id INT, name VARCHAR(255))
AS
BEGIN
    DECLARE @error INT, @obj INT, @c INT, @sheetname VARCHAR(255), @sheetstring VARCHAR(255);

    EXEC @error = sp_OACreate 'Excel.Application', @obj OUT;
    EXEC @error = sp_OAMethod @obj, 'Workbooks.Open', @c OUT, @filename;
    EXEC @error = sp_OAGetProperty @obj, 'ActiveWorkbook.Sheets.Count', @c OUT;

    WHILE @c > 0
    BEGIN
        SET @sheetstring = 'ActiveWorkbook.Sheets(' + LTRIM(@c) + ').Name';
        EXEC @error = sp_OAGetProperty @obj, @sheetstring, @sheetname OUT;
        INSERT INTO @t SELECT @c, @sheetname;
        SET @c = @c - 1;
    END

    EXEC @error = sp_OADestroy @obj;
    RETURN;
END;
GO

-- 測試
SELECT * FROM dbo.udf_getExcelTableNames('E:/aa.xls');
/*
id  name
3   Sheet3
2   Sheet2
1   Sheet1
*/

前置需求

  1. 啟用 OLE Automation:
    sp_configure 'show advanced options', 1; RECONFIGURE;
    sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
  2. 資料庫伺服器需安裝 Excel(或至少 Excel 應用程式元件)。
  3. 執行身分需具備存取檔案路徑權限。

適用場景與限制

  • 適用於 SSIS、ETL 前置作業:動態取得 Sheet 名稱再決定匯入策略。
  • 效能較低(啟動 COM 物件),不適合高頻呼叫。
  • 64 位元環境需確認 Excel.Application ProgID 可用。

現代替代方案

  • OPENROWSET / OPENDATASOURCE 搭配 ACE OLEDB Provider(不需安裝 Excel)。
  • SSIS Excel 連線管理員 + Foreach 迴圈容器。
  • CLR 函數使用 EPPlus、NPOI 等純 .NET 程式庫。

此函數展示 SQL Server 呼叫 COM 物件的經典模式,維護舊系統時常見;新專案建議採用無 Office 相依的方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved