OPENQUERY (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

OPENQUERY ( linked_server ,'query' )  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

linked_server
リンク サーバーの名前を表す識別子です。

'query'
リンク サーバーで実行されるクエリ文字列です。 文字列の最大長は 8 KB です。

解説

OPENQUERY は、その引数で変数を受け入れません。

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

EXEC SeattleSales.master.dbo.xp_msver  

FROM 句での OPENDATASOURCE、OPENQUERY、または OPENROWSET の呼び出しは、更新の対象として使用されるこれらの関数の呼び出しとは別に評価されます。これは、両方の呼び出しに同じ引数が指定されている場合にも当てはまります。 特に、いずれか一方の呼び出しの結果に適用されるフィルター条件または結合条件は、もう一方の結果に影響しません。

アクセス許可

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

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

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

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

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

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

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

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

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

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

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

次の例では、SELECT パススルー クエリを使用して、例 B で追加した行を選択します。

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

参照

DELETE (Transact-SQL)
FROM (Transact-SQL)
INSERT (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
sp_addlinkedserver (Transact-SQL)
sp_serveroption (Transact-SQL)
UPDATE (Transact-SQL)
WHERE (Transact-SQL)