| 場景 | 核心語法/工具 | 適用版本/備註 |
|---|---|---|
| Excel → SQL Server(目標表已存在) | INSERT INTO 表 SELECT * FROM OPENROWSET(...) | 需啟用 Ad Hoc Distributed Queries |
| Excel → SQL Server(自動建表) | SELECT * INTO 表 FROM OPENROWSET(...) | 同前 |
| SQL Server → Excel(檔案與欄位已存在) | INSERT INTO OPENROWSET(...) SELECT * FROM 表 | Excel 必須預建工作表與標題列 |
| SQL Server → Excel(檔案不存在,生成真 .xls) | 自訂預存程序 p_exporttb(ADOX 建表 + OpenRowset 寫入) | 支援標準資料類型,自動建檔/建表 |
| 大量匯出/排程作業 | BCP 命令列或 xp_cmdshell | 產出為文字檔(CSV 偽裝 .xls),非真 Excel 二進位 |
OPENROWSET(
'MICROSOFT.JET.OLEDB.4.0',
'Excel 5.0;HDR=YES;DATABASE=C:\Data\test.xls',
'Sheet1$' -- 工作表名需加 $ 尾碼
)
HDR=YES:首列為欄位名;HDR=NO 則以 F1、F2... 命名。IMEX=1(進階):混合資料類型欄位強制以文字讀取,避免型別推斷錯誤。xp_fileexist 決定連接字串是否需 CREATE_DB 子句syscolumns + systypes,排除 image/text/ntext/varbinary/timestamp/uniqueidentifier/sql_variant 等不支援型別,映射對應 Excel/ODBC 型別(text/int/datetime/money)sp_OACreate 'ADODB.Connection' → Open → Execute CREATE TABLEINSERT INTO OPENROWSET(...) SELECT ... FROM 來源表sp_OAGetErrorInfo 回傳錯誤號、來源、描述sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGUREMicrosoft.ACE.OLEDB.12.0 Provider,連接字串調整為 Excel 12.0 Xml。[欄位名] 括起。-b 批次大小、-h TABLOCK 鎖定資料表、簡單復原模式下 BULK INSERT 更快。BULK INSERT → OPENJSON 解析(需轉 JSON)INSERT INTO 入庫。從經典 OPENROWSET、BCP 到自訂 p_exporttb,再到現代雲端 ETL 工具,SQL Server 與 Excel 互導已有成熟生態。選型原則:臨時/小量用 OPENROWSET;排程/大量用 BCP/SSIS;跨平台/雲端用 PolyBase/ADF。掌握核心參數與型別映射,即能游刃有餘應對各類互導需求。