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

SQL Server 讀取 Excel 工作表名稱與欄位:Linked Server + 系統預存程序實戰

     編輯:關於SqlServer

場景

需在 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';

關鍵點解析

項目說明
ProviderMicrosoft.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

常見坑

  • 「找不到提供者」:未安裝 ACE 驅動或 32/64 位不匹配
  • 「資料類型猜測錯誤」:混合類型欄位預設掃描前 8 行,可用 IMEX=1 強制文字模式
  • 臨時連結伺服器殘留:腳本中斷導致 sp_dropserver 未執行,下次建立失敗 → 手動清理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved