SQL Server 將查詢字串原樣傳送至 OLE DB 提供者,由遠端引擎解析執行,結果以資料列集返回。適用於:
ICommand 介面| 函數 | 用途 | 語法重點 |
|---|---|---|
| OPENROWSET | Ad-hoc 連線,無需建立連結伺服器 | OPENROWSET(provider, 'connection_string', 'query') |
| OPENDATASOURCE | Ad-hoc 連線,僅指定提供者與連線字串 | OPENDATASOURCE(provider, 'connection_string')...table |
| OPENQUERY | 透過連結伺服器執行 Pass-Through | OPENQUERY(linked_server, 'query') |
SELECT *
FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0', -- Provider
'C:\Northwind.mdb';'admin';'', -- Connection string (Data Source;User ID;Password)
'SELECT CustomerID, CompanyName -- Pass-through query (Jet SQL)
FROM Customers
WHERE Region = ''WA'''
);
注意:Pass-through 查詢內部的單引號需雙寫 (''WA'')。
EXEC sp_addlinkedserver
@server = 'ORA_PROD',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORCL'; -- TNS alias
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'ORA_PROD',
@useself = 'FALSE',
@locallogin = NULL,
@rmtuser = 'app_user',
@rmtpassword = '*****';
SELECT *
FROM OPENQUERY(ORA_PROD, '
SELECT customer_id, customer_name, order_total
FROM orders
WHERE order_date BETWEEN DATE ''2024-01-01'' AND DATE ''2024-01-31''
AND status = ''SHIPPED''
');
SET STATISTICS IO, TIME ON 比較 OPENQUERY vs 四部分命名 (LINKED..SCHEMA.TABLE) 效能| 目標來源 | 建議提供者 | 備註 |
|---|---|---|
| SQL Server (異機/異實例) | SQLNCLI11 / MSOLEDBSQL | 支援新資料型別、Always Encrypted |
| Oracle | OraOLEDB.Oracle (Oracle Client) / Oracle Provider for OLE DB | 需安裝 Oracle Instant Client |
| DB2 | IBMDADB2 / IBMDADB2DS | 需 DB2 Connect / Client |
| PostgreSQL | PGNP OLE DB Provider (商業) / ODBC 搭配 MSDASQL | 開源 pg_oledb 發展中 |
| MySQL | MySQL Provider for OLE DB / ODBC + MSDASQL | |
| Access / Excel | Microsoft.ACE.OLEDB.12.0 / 16.0 | 需安裝 Access Database Engine |
| 文字檔 / CSV | Microsoft.Jet.OLEDB.4.0 (舊) / ACE (新) | Schema.ini 定義欄位型別 |
Ad Hoc Distributed Queries 伺服器選項需啟用 (預設關閉):EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURECONTROL SERVER 權限的登入使用 OPENROWSET/OPENDATASOURCESSL=TRUE、SQL Server: Encrypt=Yes)| 錯誤 | 原因 | 解決 |
|---|---|---|
| 7399 / 7303 | 提供者未註冊/版本不符 | 確認 64-bit 提供者已安裝 (SQL Server 為 64-bit) |
| 7314 | 提供者不支援 ICommand | 該提供者僅支援目錄物件,改用四部分命名或 OPENROWSET 目錄模式 |
| 7391 | 分散式交易 (MSDTC) 啟動失敗 | 啟用 MSDTC、網路存取、雙向防火牆、認證委派 |
| 登入失敗 | 遠端認證錯誤/鎖定 | 檢查連結伺服器登入對應、遠端帳號狀態 |
Pass-Through 查詢是 SQL Server 整合異構資料的利器。核心原則:在資料所在地處理資料,僅傳輸結果集。生產環境請優先使用連結伺服器 + OPENQUERY,集中管理連線與認證,配合提供者原生語法發揮遠端引擎最大效能。