OPENQUERY (Transact-SQL)

指定したパススルー クエリを、指定したリンク サーバーで実行します。このサーバーは OLE DB データ ソースです。OPENQUERY は、テーブル名と同じように、クエリの FROM 句で参照できます。また、INSERT、UPDATE、または DELETE ステートメントの対象テーブルとして参照することもできます。これは OLE DB プロバイダの機能により制限されます。クエリでは複数の結果セットが返されることがありますが、OPENQUERY では最初の 1 つのみが返されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

OPENQUERY ( linked_server ,'query' )

引数

  • linked_server
    リンク サーバーの名前を表す識別子を指定します。

  • 'query'
    リンク サーバーで実行するクエリ文字列を指定します。文字列の最大長は 8 KB です。

説明

OPENQUERY の引数に変数は指定できません。

OPENQUERY を使用して、リンク サーバーで拡張ストアド プロシージャを実行することはできません。ただし、4 つの要素で構成される名前を使用して、リンク サーバーで拡張ストアド プロシージャを実行することはできます。次に例を示します。

EXEC SeattleSales.master.dbo.xp_msver

権限

すべてのユーザーが OPENQUERY を実行できます。リモート サーバーへの接続に使用される権限は、リンク サーバー用の定義から取得されます。

A. SELECT パススルー クエリを実行する

次の例では、Microsoft OLE DB Provider for Oracle を使用して、Oracle データベースに OracleSvr というリンク サーバーを作成します。次に、このリンク サーバーに対して SELECT パススルー クエリを実行します。

注意注意

この例では、ORCLDB という Oracle データベースの別名が作成されていることを前提としています。

EXEC sp_addlinkedserver 'OracleSvr', 
   'Oracle 7.3', 
   'MSDAORA', 
   'ORCLDB';
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles'); 
GO

B. UPDATE パススルー クエリを実行する

次の例では、例 A で作成したリンク サーバーに対して、UPDATE パススルー クエリを使用します。

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') 
SET name = 'ADifferentName';

C. INSERT パススルー クエリを実行する

次の例では、例 A で作成したリンク サーバーに対して、INSERT パススルー クエリを使用します。

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')
VALUES ('NewTitle');

D. DELETE パススルー クエリを実行する

次の例では、DELETE パススルー クエリを使用して、例 C で追加した行を削除します。

DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');