需在 T-SQL 中動態獲取 Excel 檔案(.xls/.xlsx)的所有工作表名稱及各表欄位清單,無需預知結構。
-- 參數區
DECLARE @linkedServerName SYSNAME = 'TempExcelSpreadsheet';
DECLARE @excelFileUrl NVARCHAR(1000) = N'D:\text.xlsx'; -- ★ 修改路徑
-- 1. 清理舊連結伺服器
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = @linkedServerName)
EXEC sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins';
-- 2. 建立連結伺服器 (ACE 12.0 支援 .xls/.xlsx)
EXEC sp_addlinkedserver
@server = @linkedServerName,
@srvproduct = 'ACE 12.0',
@provider = 'Microsoft.ACE.OLEDB.12.0',
@datasrc = @excelFileUrl,
@provstr = 'Excel 12.0;HDR=YES'; -- HDR=YES 第一行為標題
-- 3. 映射當前登入
DECLARE @currentLogin NVARCHAR(256) = SUSER_SNAME();
EXEC sp_addlinkedsrvlogin
@rmtsrvname = @linkedServerName,
@useself = 'FALSE',
@locallogin = @currentLogin,
@rmtuser = NULL,
@rmtpassword = NULL;
-- 4. 獲取工作表清單 (系統表名以 $ 結尾)
EXEC sp_tables_ex @linkedServerName;
-- 5. 獲取所有欄位清單
EXEC sp_columns_ex @linkedServerName;
-- 6. 清理連結伺服器
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = @linkedServerName)
EXEC sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins';
| 項目 | 說明 |
|---|---|
| Provider | Microsoft.ACE.OLEDB.12.0 需安裝 Access Database Engine 2010/2016 Redistributable (x64 版配合 SQL Server x64) |
| HDR=YES | 第一行視為標題列;HDR=NO 則第一行為資料,欄位名自動生成 F1, F2... |
| 工作表名 | 返回 TABLE_NAME 如 Sheet1$、MyData$,查詢時需用 [Sheet1$] 方括號 |
| 權限 | SQL Server 服務帳戶需有檔案讀取權限;網路路徑需委派認證 |
DECLARE @sheet SYSNAME = 'Sheet1$';
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM [' + @sheet + ']';
EXEC (@sql) AT TempExcelSpreadsheet; -- 四部分命名或 OPENQUERY
IMEX=1 強制文字模式sp_dropserver 未執行,下次建立失敗 → 手動清理