共用方式為


OPENROWSET (Transact-SQL)

適用於: SQL Server 2016 (13.x) 和更新版本

OPENROWSET 是存取連結伺服器中數據表的替代方法,也是連線和存取遠端數據的一次性臨機作方法。 OPENROWSET T-SQL 命令包含從外部數據來源存取遠端資料所需的所有連接資訊。

OPENROWSET 式可以在查詢的 子句中 FROM 參考,就像是數據表名稱一樣。 函OPENROWSET式也可以參考為、 INSERTUPDATE 語句的目標數據表DELETE,但受限於數據提供者的功能。 雖然查詢可能傳回多個結果集,但是 OPENROWSET 只能傳回第一個。

小提示

如需外部數據源的更頻繁參考,請改用連結的伺服器。 如需詳細資訊,請參閱連結的伺服器 (資料庫引擎)

OPENROWSET BULK沒有 運算子的,只能在 SQL Server 上使用。 其他平台上類似範例的詳細數據和連結:

Transact-SQL 語法慣例

語法

OPENROWSET 語法可用來查詢外部資料來源:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

引數

'provider_name'

字元字串,表示登錄中所指定之數據提供者的易記名稱(或 PROGID)。 provider_name 沒有預設值。 提供者名稱範例包括 MSOLEDBSQLMicrosoft.Jet.OLEDB.4.0MSDASQL

'datasource'

對應至特定數據源的字串常數。 datasourceDBPROP_INIT_DATASOURCE 要傳遞至 IDBProperties 提供者介面的屬性,以初始化提供者。 一般而言,此字串包含資料庫檔名、資料庫伺服器的名稱,或提供者了解尋找資料庫或資料庫的名稱。

資料來源可以是 C:\SAMPLES\Northwind.mdb' 提供者的檔案路徑 Microsoft.Jet.OLEDB.4.0,或 Server=Seattle1;Trusted_Connection=yes; 提供者的連接字串 MSOLEDBSQL

'user_id'

字串常數,這是傳遞至指定數據提供者的用戶名稱。 user_id會指定連接的安全性內容,並當做 DBPROP_AUTH_USERID 屬性傳入以初始化提供者。 user_id不能是 windows 登入名稱Microsoft。

'password'

字串常數,這是要傳遞至數據提供者的用戶密碼。 初始化提供者時,密碼 會當做 DBPROP_AUTH_PASSWORD 屬性傳入。 password 不能是Microsoft Windows 密碼。 例如:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

'provider_string'

作為 屬性傳入DBPROP_INIT_PROVIDERSTRING的提供者特定 連接字串,以初始化 OLE DB 提供者。 provider_string 通常會封裝將提供者初始化所需的所有連線資訊。

如需 SQL Server Native Client OLE DB 提供者可辨識的關鍵詞清單,請參閱 初始化和授權屬性 (Native Client OLE DB Provider)SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 移除。 不建議使用 SQL Server Native Client OLE DB 提供者 (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 進行新的開發。 請切換至新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 以繼續使用。

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ catalog. ] [ 架構。 ] 物件

遠端資料表或檢視表,其中包含 OPENROWSET 應該讀取的資料。 可以是具有下列元件的三部分名稱物件:

  • catalog (選擇性) - 這是所指定物件所在的目錄或資料庫名稱。
  • schema (選擇性) - 這是所指定物件的結構描述或物件擁有者名稱。
  • object - 這是唯一識別所處理物件的物件名稱。
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

傳送至 提供者和執行的字串常數。 SQL Server 的本機實例不會處理此查詢,但會處理提供者傳回的查詢結果,這是傳遞查詢。 傳遞查詢在未透過資料表名稱提供表格式數據的提供者上使用時很有用,但只能透過命令語言使用。 只要查詢提供者支援 OLE DB Command 物件與其必要介面,遠端伺服器就支援通過查詢。

如需詳細資訊,請參閱 SQL Server Native Client (OLE DB) 介面

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

備註

唯有針對指定的提供者將 OPENROWSET 登錄選項明確設定為 0,且已啟用 [隨選分散式查詢] 進階設定選項時,才能使用 來存取 OLE DB 資料來源的遠端資料。 如果未設定這些選項,預設行為不允許臨機操作存取。

當您存取遠端 OLE DB 數據源時,信任連線的登入身分識別不會從用戶端連線到所查詢伺服器的伺服器上自動委派。 此時必須設定驗證委派。

如果資料提供者支援指定數據來源中的多個目錄和架構,則需要目錄和架構名稱。 catalog當數據提供者不支援 和 schema 的值時,可以省略 和的值。 如果提供者只支援架構名稱,則必須指定表單 schema.object 的兩部分名稱。 如果提供者只支援目錄名稱,則必須指定表單 catalog.schema.object 的三部分名稱。 如需詳細資訊,請參閱 Transact-SQL 語法慣例

使用 SQL Server Native Client OLE DB 提供者的傳遞查詢需要三部分名稱。

OPENROWSET 不接受其自變數的變數。

OPENDATASOURCE 子句中 OPENQUERYOPENROWSETFROM 的任何呼叫都會與當做更新目標使用之這些函數的任何呼叫進行個別且獨立的評估,即使完全相同的引數套用至這兩種呼叫也一樣。 尤其,針對其中一個呼叫結果所套用的篩選或聯結條件對於另一個呼叫的結果沒有作用。

權限

OPENROWSET 許可權是由傳遞至數據提供者的用戶名稱許可權所決定。

範例

本節提供一般範例來示範如何使用 OPENROWSET。

注意

如需使用 INSERT...SELECT * FROM OPENROWSET(BULK...)的範例,請參閱 OPENROWSET BULK (Transact-SQL)。

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 移除。 不建議使用 SQL Server Native Client OLE DB 提供者 (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 進行新的開發。 請切換至新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 以繼續使用。

A。 搭配 SELECT 和 SQL Server Native Client OLE DB 提供者使用 OPENROWSET

下列範例會使用 SQL Server Native Client OLE DB 提供者來存取遠端伺服器 HumanResources.DepartmentAdventureWorks2022 資料庫中的 Seattle1 資料表 (用於 MSOLEDBSQL 取代 SQLNCLI的新式 Microsoft SQL Server OLE DB 數據提供者。 SELECT 語句可用來定義傳回的數據列集。 提供者字串包含 ServerTrusted_Connection 關鍵字。 這些關鍵字是由 SQL Server Native Client OLE DB 提供者所辨識。

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. 使用 Microsoft OLE DB Provider for Jet

下列範例會透過 Microsoft OLE DB Provider for Jet,存取 Microsoft Access Customers 資料庫中的 Northwind 資料表。

注意

此範例假設已安裝 Microsoft Access。 若要執行此範例,您必須安裝 Northwind 資料庫。

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

C. 在 INNER JOIN 中使用 OPENROWSET 和另一個數據表

下列範例會從 SQL Server Customers 資料庫的本機實例,以及從Northwind儲存在相同計算機上之 Microsoft Access Orders 資料庫的數據表中選取Northwind所有數據。

注意

此範例假設已安裝 Microsoft Access。 若要執行此範例,您必須安裝 Northwind 資料庫。

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;