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

SQL Server 透過 OPENROWSET 與 OPENQUERY 使用直接傳遞查詢

     編輯:關於SqlServer

SQL Server 2000 提供了強大的分布式查詢能力,允許將 OLE DB 數據源(如 Access、Oracle、Excel、文本文件)視為虛擬表直接參與 T-SQL 查詢。核心在於 OPENROWSET、OPENQUERY 與 OPENDATASOURCE 三大函數,它們讓跨數據源查詢如同操作本地表般自然。本文將深入解析其原理、語法與實戰場景。

核心概念:直接傳遞查詢

直接傳遞查詢將未經解析的命令字串直接發送至 OLE DB 提供程序執行。查詢語法必須符合目標數據源規範(如 Access 用 Jet SQL,Oracle 用 PL/SQL)。SQL Server 僅負責接收結果集並以表格形式呈現,可直接用於 FROM、JOIN、INSERT 等子句中。

三大核心函數對比

函數適用場景是否需鏈接服務器典型語法
OPENROWSET臨時、一次性訪問 OLE DB 數據源否OPENROWSET('Provider', 'ConnectionString', 'Query')
OPENDATASOURCE臨時連接,僅引用表/視圖,不執行複雜命令否OPENDATASOURCE('Provider', 'ConnectionString')...TableName
OPENQUERY已配置鏈接服務器的常規、重複性訪問是OPENQUERY(LinkedServerName, 'Query')

實戰範例:從 Access Northwind 數據庫查詢數據

SELECT *
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Northwind.mdb'; 'admin'; '',
    'SELECT CustomerID, CompanyName FROM Customers WHERE Region = ''WA''');

參數解析:

  1. 'Microsoft.Jet.OLEDB.4.0':Access 2000/OLE DB Provider 名稱。
  2. 'C:\Northwind.mdb'; 'admin'; '':連接字串(數據源路徑、用戶名、密碼)。
  3. 'SELECT ...':傳遞給 Access 引擎執行的原生 SQL(注意單引號轉義)。

進階用法與最佳實踐

1. 將結果集作為表參與 JOIN 查詢

SELECT e.EmployeeName, o.OrderID, o.OrderDate
FROM LocalEmployees e
INNER JOIN OPENROWSET(
    'SQLOLEDB', 'Server=RemoteSrv;UID=sa;PWD=xxx',
    'SELECT OrderID, OrderDate, EmpID FROM Northwind.dbo.Orders') o
ON e.EmpID = o.EmpID;

2. 直接插入遠程數據

INSERT INTO LocalArchive (OrderID, OrderDate, CustomerID)
SELECT OrderID, OrderDate, CustomerID
FROM OPENROWSET('SQLOLEDB', 'Server=Prod;UID=etl;PWD=xxx',
                'SELECT OrderID, OrderDate, CustomerID FROM Orders WHERE OrderDate < ''2020-01-01''');

3. 使用鏈接服務器簡化管理

-- 一次性創建鏈接服務器
EXEC sp_addlinkedserver @server = 'AccessNorthwind',
    @srvproduct = '',
    @provider = 'Microsoft.Jet.OLEDB.4.0',
    @datasrc = 'C:\Northwind.mdb';

-- 後續查詢極度簡潔
SELECT * FROM OPENQUERY(AccessNorthwind, 'SELECT * FROM Customers WHERE Country = ''USA''');

提供程序支援與限制

  • 所有 OLE DB 提供程序 均支援引用可表現為表格行集的對象(表、視圖)。
  • 支援 Command 對象 的提供程序(如 SQLOLEDB、Jet OLEDB、MSDAORA)才能執行命令字串(即直接傳遞查詢)。
  • OLE DB 規範未統一命令語言:關係型數據庫通常支援 SQL,非關係型源(郵件、目錄服務)則使用專屬語言。
  • Access/Excel 文件路徑必須為 SQL Server 服務賬戶可訪問的本地路徑或 UNC 路徑,映射網絡盤符不可靠。

常見問題排查

總結

直接傳遞查詢打破了數據孤島,讓 SQL Server 成為企業級數據整合樞紐。掌握 OPENROWSET(臨時)、OPENQUERY(常規)、OPENDATASOURCE(輕量)三者的適用邊界,並善用鏈接服務器管理連接元數據,能極大提升跨源查詢的開發效率與運行穩定性。記住:遠程邏輯下推、類型顯式轉換、認證提前規劃 是生產環境落地的三大鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題原因解決
「找不到提供程序」目標機未安裝對應 OLE DB Provider安裝 Access Database Engine / Oracle Client / SQL Native Client
「雙跳」認證失敗Windows 認證下憑證無法轉發至第三台機器配置 Kerberos 委派,或使用 SQL 認證/固定帳戶
查詢超時遠程執行時間過長優化遠程 SQL、增加查詢超時設置、分頁抓取
數據類型不匹配遠程類型無法隱式轉換為 SQL Server 類型在遠程查詢中用 CAST/CONVERT 顯式轉換