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

Excel 數據導入 SQL Server 2005 完整配置指南:OPENROWSET/OPENDATASOURCE、分布式查詢啟用、Jet/ACE 驅動、IMEX 模式詳解

     編輯:關於SqlServer

前置配置四步驟

  1. 外圍應用配置器:服務和連接 → Database Engine → 服務 → 重啟服務
  2. 注冊表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers\Microsoft.Jet.OLEDB.4.0
    新建 DWORD (64位) DisallowAdhocAccess = 0
  3. 功能外圍配置:Database Engine → 即席遠程查詢 → 勾選「啟用 OPENROWSET 和 OPENDATASOURCE 支持」
  4. 啟用分布式查詢(每次用完建議關閉):
    EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
    EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
    -- 用完後
    EXEC sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE;
    EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
    

導入語句兩種寫法

OPENDATASOURCE + SELECT INTO(建新表)

SELECT * INTO y 
FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
  'Data Source="G:\1.xls";Extended Properties="Excel 8.0;HDR=YES;IMEX=1"')...[Sheet1$];

OPENROWSET + INSERT INTO(追加到現有表)

INSERT INTO x 
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
  'Excel 8.0;HDR=YES;DATABASE=G:\1.xls', 'SELECT * FROM [Sheet1$]');

關鍵參數詳解

參數值含義建議
ProviderMicrosoft.Jet.OLEDB.4.0Jet 4.0 驅動(僅 32 位,支持 .xls)32 位環境用
ProviderMicrosoft.ACE.OLEDB.12.0ACE 12.0 驅動(支持 .xls/.xlsx,有 64 位版)64 位/新版本首選
Extended PropertiesExcel 8.0Excel 97-2003 格式.xls 固定用 8.0
Extended PropertiesExcel 12.0 XmlExcel 2007+ (.xlsx).xlsx 用此值
HDRYES / NO第一行是否列名標準表頭用 YES
IMEX0 / 1 / 2導出/導入/連接模式讀取必用 1

IMEX 三種模式深度解析

  • IMEX=0 導出模式:僅寫入,讀取會報錯或返回空
  • IMEX=1 導入模式(只讀):混合類型列按文本讀取,避免數字列前幾行是數字後面是文本導致文本行讀為 NULL,**讀取 Excel 必須設置 1**
  • IMEX=2 連接模式:可讀可寫,但鎖定文件,併發差,生產慎用

64 位環境部署避坑

  1. 安裝 Microsoft Access Database Engine 2010/2016 Redistributable (x64)
  2. 連接字串改用 ACE:Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'
  3. SQL Server 服務賬號需有文件讀取權限(或用 SQL 代理代理賬號)
  4. 若報「找不到安裝可用的 ISAM」,檢查驅動位數與 SQL Server 進程位數一致

常見錯誤對策

錯誤原因解決
無法初始化數據源文件被佔用/路徑錯誤/權限不足關閉 Excel、用 UNC 路徑、授權服務賬號
DisallowAdhocAccess注冊表值為 1 或缺失設置為 0 並重啟 SQL 服務
Ad Hoc Distributed Queries disabled未啟用分布式查詢執行 sp_configure 啟用
工作表名不存在Sheet 名稱錯誤/帶空格用 [Sheet1$] 含 $ 且方括號
數據類型不匹配IMEX=0 導致混合列讀空強制 IMEX=1

最佳實踐

  • 導入前關閉 Excel 文件
  • 大數據量分批導入,避免長事務鎖表
  • 臨時表中轉,清洗驗證後再寫業務表
  • 導入腳本參數化,納入部署流程
  • 定期清理導入產生的臨時表/備份表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved