適用対象: SQL Server 2016 (13.x) 以降のバージョン
OPENROWSET
は、リンク サーバー内のテーブルにアクセスする代わりに、リモート データに接続してアクセスする 1 回限りのアドホックメソッドです。
OPENROWSET
T-SQL コマンドには、外部データ ソースからリモート データにアクセスするために必要なすべての接続情報が含まれます。
OPENROWSET
関数は、クエリのFROM
句でテーブル名であるかのように参照できます。
OPENROWSET
関数は、データ プロバイダーの機能に従って、INSERT
、UPDATE
、または DELETE
ステートメントのターゲット テーブルとして参照することもできます。 クエリでは複数の結果セットが返される場合がありますが、OPENROWSET
では最初の 1 つだけが返されます。
ヒント
外部データ ソースへの参照を頻繁に行うには、代わりにリンク サーバーを使用してください。 詳しくは、「リンク サーバー (データベース エンジン)」を参照してください。
OPENROWSET
BULK
演算子を使用しない場合は、SQL Server でのみ使用できます。 他のプラットフォームでの同様の例の詳細とリンク:
-
OPENROWSET
では、Azure や Microsoft Fabric など、多くのデータベース エンジン プラットフォーム上の組み込みのBULK
プロバイダーを介した一括操作がサポートされています。 詳細については、 OPENROWSET BULK (Transact-SQL) を参照してください。 - Azure SQL Managed Instance の例については、OPENROWSET を使用した Query データ ソースを参照してください。
- Azure SQL Database では、 OPENROWSET BULK (Transact-SQL) のみがサポートされます。
- Azure Synapse のサーバーレス SQL プールの詳細と例については、「 Azure Synapse Analytics でサーバーレス SQL プールを使用して OPENROWSET を使用する方法を参照してください。 Azure Synapse の専用 SQL プールでは、
OPENROWSET
関数はサポートされていません。
構文
OPENROWSET
構文は、外部データ ソースのクエリに使用されます。
OPENROWSET
( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
, { [ catalog. ] [ schema. ] object | 'query' }
)
引数
'provider_name'
レジストリで指定されたデータ プロバイダーのフレンドリ名 (または PROGID
) を表す文字列。
provider_name 既定値はありません。 プロバイダー名の例としては、MSOLEDBSQL
、Microsoft.Jet.OLEDB.4.0
、MSDASQL
があります。
'datasource'
特定のデータ ソースに対応する文字列定数。
datasource は、プロバイダーを初期化するためにプロバイダーのDBPROP_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 は Microsoft Windows ログイン名にすることはできません。
'password'
データ プロバイダーに渡されるユーザー パスワードである文字列定数。
password は、プロバイダーの初期化時に DBPROP_AUTH_PASSWORD
プロパティとして渡されます。
パスワード は Microsoft Windows パスワードにすることはできません。 例えば次が挙げられます。
SELECT a.* FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'C:\SAMPLES\Northwind.mdb';
'<user name>';
'<password>',
Customers
) AS a;
'provider_string'
OLE DB プロバイダーを初期化するためにDBPROP_INIT_PROVIDERSTRING
プロパティとして渡されるプロバイダー固有の接続文字列。
provider_string 通常、プロバイダーの初期化に必要なすべての接続情報をカプセル化します。
SQL Server Native Client OLE DB プロバイダーが認識するキーワードの一覧については、「 初期化と承認のプロパティ (ネイティブ クライアント OLE DB プロバイダー)」を参照してください。 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;
[ カタログ。 ] [ スキーマ。 ] オブジェクト
OPENROWSET
で読み取る必要のあるデータを含むリモート テーブルまたはビュー。 次の構成要素を持つ 3 つの部分から成る名前のオブジェクトにすることができます。
- catalog (省略可能) - 指定したオブジェクトが存在するカタログまたはデータベースの名前。
- schema (省略可能) - 指定したオブジェクトのスキーマまたはオブジェクト所有者の名前。
- object - 操作するオブジェクトを一意に識別するオブジェクト名。
SELECT d.* FROM OPENROWSET(
'MSOLEDBSQL',
'Server=Seattle1;Trusted_Connection=yes;',
AdventureWorks2022.HumanResources.Department
) AS d;
'query'
プロバイダーに送信され、プロバイダーによって実行される文字列定数。 SQL Server のローカル インスタンスでは、このクエリは処理されませんが、プロバイダーによって返されたクエリ結果 (パススルー クエリ) が処理されます。 パススルー クエリは、テーブル名を使用して表形式データを使用できないプロバイダーで使用する場合に便利です。ただし、コマンド言語でのみ使用できます。 パススルー クエリは、クエリ プロバイダーが OLE DB をサポートしていれば、リモート サーバーでサポートされてコマンド オブジェクトとその必須インターフェイス。
詳細については、「 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
は、OLE DB データ ソースからリモート データにアクセスするときに使用できます。ただしこの場合、指定したプロバイダーに対して DisallowAdhocAccess レジストリ オプションが明示的に 0 に設定されており、Ad Hoc Distributed Queries 詳細構成オプションが有効になっている必要があります。 これらのオプションが設定されていない場合、既定の動作ではアドホック アクセスは許可されません。
リモート OLE DB データ ソースにアクセスすると、クライアントがクエリ対象のサーバーに接続されているサーバーから、信頼された接続のログイン ID が自動的に委任されることはありません。 したがって、認証の委任を構成する必要があります。
データ プロバイダーが指定したデータ ソース内の複数のカタログとスキーマをサポートしている場合は、カタログとスキーマの名前が必要です。
catalog
とschema
の値は、データ プロバイダーがサポートしていない場合は省略できます。 プロバイダーがスキーマ名のみをサポートしている場合は、フォーム schema.object
の 2 部構成の名前を指定する必要があります。 プロバイダーがカタログ名のみをサポートしている場合は、フォーム catalog.schema.object
の 3 部構成の名前を指定する必要があります。 詳細については、「Transact-SQL 構文表記規則」を参照してください。
SQL Server Native Client OLE DB プロバイダーを使用するパススルー クエリには、3 部構成の名前が必要です。
OPENROWSET
では、引数の変数は受け入れられません。
OPENDATASOURCE
句での OPENQUERY
、OPENROWSET
、または FROM
の呼び出しは、更新のターゲットとして使用されるこれらの関数の呼び出しとは別に評価されます。これは、両方の呼び出しに同じ引数が指定されている場合にも当てはまります。 特に、いずれか一方の呼び出しの結果に適用されるフィルター条件または結合条件は、もう一方の結果に影響しません。
アクセス許可
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 Provider で OPENROWSET を使用する
次の例では、SQL Server Native Client OLE DB プロバイダーを使用して、リモート サーバー HumanResources.Department
のデータベース AdventureWorks2022
のテーブル Seattle1
にアクセスします (MSOLEDBSQL
を置き換えた最新の Microsoft SQL Server OLE DB データ プロバイダーには、SQLNCLI
を使用します)。SELECT
ステートメントは、返される行セットを定義するために使用されます。 プロバイダーの文字列には、Server
と Trusted_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;