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
*/
sp_configure 'show advanced options', 1; RECONFIGURE;
sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;Excel.Application ProgID 可用。OPENROWSET / OPENDATASOURCE 搭配 ACE OLEDB Provider(不需安裝 Excel)。EPPlus、NPOI 等純 .NET 程式庫。此函數展示 SQL Server 呼叫 COM 物件的經典模式,維護舊系統時常見;新專案建議採用無 Office 相依的方案。