sp_OA* 系列預存程序操作 Excel COM 物件需啟用 Ole Automation Procedures 進階選項:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
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, @count INT, @sheetName VARCHAR(255), @sheetProp VARCHAR(255);
EXEC @error = sp_OACreate 'Excel.Application', @obj OUT;
EXEC @error = sp_OAMethod @obj, 'Workbooks.Open', @count OUT, @filename;
EXEC @error = sp_OAGetProperty @obj, 'ActiveWorkbook.Sheets.Count', @count OUT;
WHILE (@count > 0)
BEGIN
SET @sheetProp = 'ActiveWorkbook.Sheets(' + LTRIM(@count) + ').Name';
EXEC @error = sp_OAGetProperty @obj, @sheetProp, @sheetName OUT;
INSERT INTO @t SELECT @count, @sheetName;
SET @count = @count - 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
*/
OPENROWSET('Microsoft.ACE.OLEDB.12.0', ...) 搭配 ACE 驅動程式