次の方法で共有


クエリ プロセッサ

DB2 の分散クエリのSQL Server

SQL Serverの分散クエリは、複数のデータ ソースへの分散同時アクセスを提供します。 分散クエリ プロセッサ (DQP) を使用すると、SQL Server 内のテーブルを、DB2、ホスト ファイル システム、Oracle、または OLE DB プロバイダーによってアクセス可能な他の任意のデータ ソース内のテーブルと結合する異種クエリを作成することができます。 DQP を使用して、DB2 テーブルを対象とする SQL ビューを作成すると、開発者が、SQL Server に直接書き込み、アプリケーション内で Windows ベースとホスト ベースの両方のデータを統合できるようになります。

次の図は、Host Integration Server (HIS) を使用してデータにアクセスするための DQP アーキテクチャを示しています。

分散クエリHIS_DQP_SQLServer

OLE DB データ ソースからデータにアクセスするには、SQL Server次の情報が必要です。

  1. OLE DB プロバイダーの名前

  2. OLE DB 初期化文字列の形式の接続情報

  3. テーブル名または SQL クエリ文字列

  4. 承認資格情報

    異種データ ソースは、次の 3 つの方法のいずれかを使用して参照できます。

  5. アドホック名

  6. リンク サーバー名

  7. Pass-Through クエリ

アドホック名クエリ

アドホック名は、リンク サーバーとして定義されていない OLE DB データ ソースに対してあまり行わないクエリに使用されます。 SQL Serverでは、OPENROWSET 関数と OPENDATASOURCE 関数は、OLE DB データ ソースからデータにアクセスするための接続情報を提供します。 既定では、アドホック名はサポートされません。 DisallowAdhocAccess プロバイダー オプションを 0 に設定し、アドホック分散クエリの高度な構成オプションを有効にする必要があります。

次のコード フラグメントは、アドホック名クエリを有効にするための構文を表示します。

-- Example of enabling Ad Hoc Name Query   
sp_configure 'show advanced options', 1;  
GO  
  
RECONFIGURE;  
GO  
  
sp_configure 'Ad Hoc Distributed Queries', 1;  
GO  
  
RECONFIGURE;  
GO  
  

次のコード フラグメントは、アドホック クエリを作成するための構文を表示します。

-- Example of OPENROWSET Ad Hoc Name Query  
  
SELECT * FROM OPENROWSET (  
'DB2OLEDB',  
'Provider=DB2OLEDB;User ID=HISDEMO;Password=HISDEMO;Initial Catalog=DSN1D037;Network Transport Library=TCPIP;Host CCSID=37;PC Code Page=1252;Network Address=SYS1;Network Port=446;Package Collection=MSPKG;Default Schema=NWIND;Units of Work=RUW;Default Qualifier=NWIND;DBMS Platform=DB2/z/OS;Use Early Metadata=False;Defer Prepare=False;DateTime As Char=False;Rowset Cache Size=0;Datetime As Date=False;AutoCommit=True;Authentication=Server;Persist Security Info=True;Cache Authentication=False;Connection Pooling=False;Derive Parameters=False;',   
  
'SELECT * FROM NWIND.AREAS'  
  
);   
  
GO  
  
-- Example of OPENDATASOURCE Ad Hoc Name Query  
  
SELECT *  
FROM OPENDATASOURCE(  
     'DB2OLEDB',  
     'Provider=DB2OLEDB;User ID=PLARSEN;Password=PLARSEN;Initial Catalog=DSN1D037;Network Transport Library=TCP;Host CCSID=37;PC Code Page=1252;Network Address=sys1;Network Port=446;Package Collection=MSPKG;Default Schema=NWIND;Units of Work=RUW;Default Qualifier=NWIND;DBMS Platform=DB2/z/OS;Defer Prepare=False;Persist Security Info=True;Connection Pooling=False;Derive Parameters=False'  
     ).[DSN1D037].[NWIND].[AREAS]  
  

OPENROWSET 関数および OPENDATASOURCE 関数は、アクセス頻度の低い OLE DB データ ソースを参照する目的のみに使用してください。 何度もアクセスするデータ ソースに対しては、リンク サーバーを定義してください。 OPENDATASOURCE と OPENROWSET はどちらも、リンク サーバーの定義に関する機能が完全に提供されているわけではありません。 たとえば、OPENROWSET と OPENDATASOURCE はマクロであり、引数としての Transact-SQL 変数の指定はサポートされていません。 アドホック名クエリには、セキュリティ管理やカタログ情報のクエリ機能は含まれません。 これらの関数が呼び出されるたびに、パスワードを含むすべての接続情報を指定する必要があります。

リンク サーバーを定義する

DB2 への接続を定義するリンク サーバー名を作成するには、Transact-SQL ステートメントを使用するか、SQL Server Management Studio ユーザー インターフェイスを使用します。

Transact-SQL

次のコード フラグメントは、リンク サーバー名定義の認証資格情報を削除、作成、および指定するための Transact-SQL 構文を示しています。

-- Example of dropping linked server by name   
  
EXEC sp_dropserver  
@server = 'DB2EXAMPLE',  
@droplogins = 'droplogins';   
  
GO  
  
-- Example of adding linked server by name  
  
EXEC sp_addlinkedserver   
  
@server = 'DB2EXAMPLE',   
  
@srvproduct = 'x''HIS',   
  
@provider = 'DB2OLEDB',   
  
@catalog = 'DSN1',   
  
@provstr = ‘Provider=DB2OLEDB;User ID=HISDEMO;Password=HISDEMO;Initial Catalog=DSN1D037;Network Transport Library=TCPIP;Host CCSID=37;PC Code Page=1252;Network Address=SYS1;Network Port=446;Package Collection=MSPKG;Default Schema=NWIND;Units of Work=RUW;Default Qualifier=NWIND;DBMS Platform=DB2/z/OS;Use Early Metadata=False;Defer Prepare=False;DateTime As Char=False;Rowset Cache Size=0;Datetime As Date=False;AutoCommit=True;Authentication=Server;Persist Security Info=True;Cache Authentication=False;Connection Pooling=False;Derive Parameters=False;';   
  
GO  
  
-- Example of adding linked server login  
  
EXEC sp_addlinkedsrvlogin   
     @rmtsrvname = 'DB2EXAMPLE',   
     @rmtuser = 'HISDEMO',   
     @rmtpassword = 'HISDEMO';   
  
GO  
  
-- Example of enabling pass-through queries  
  
EXEC sp_serveroption   
    @server =  'DB2EXAMPLE',  
    @optname =  'RPC OUT',  
    @optvalue =  'TRUE' ;   
  
GO  
  
-- Example of listing linked servers and options  
EXEC sp_linkedservers;  
GO  
EXEC sp_helpserver;  
GO  
  
-- Example of listing DB2 tables with restriction on schema name  
-- List DB2 columns with restrictions on table name  
  
EXEC sp_columns_ex  
   @table_server = 'DB2EXAMPLE',  
   @table_catalog = 'DSN1D037',  
   @table_schema = 'NWIND',  
   @table_name = 'ORDERS';   
  
GO  
  
-- Example of listing DB2 columns with restriction on schema and table names  
EXEC sp_columns_ex  
   @table_server = 'DB2EXAMPLE',  
   @table_catalog = 'DSN1D037',  
   @table_schema = 'NWIND',  
   @table_name = 'ORDERS';   
  
GO  
  
-- Example of linked server query (SELECT)   
  
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS  
  
GO  
  
-- Example of linked server query (INSERT)   
  
INSERT INTO DB2EXAMPLE.DSN1D037.NWIND.AREAS VALUES (99999, 'Everywhere', 999)   
  
GO  
  
-- Example of linked server query (SELECT with WHERE clause)   
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE REGIONID > 104  
GO  
-- Example of linked server query (UPDATE)   
  
UPDATE DB2EXAMPLE.DSN1D037.NWIND.AREAS SET AREADESC = 'Nowhere' WHERE AREAID = 99999  
  
GO  
  
-- Example of linked server query (SELECT with WHERE clause)   
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE REGIONID > 104  
GO  
-- Example of linked server query (DELETE)   
  
DELETE FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE AREAID = 99999  
  
GO   
  
-- Example of linked server query (SELECT with WHERE clause)   
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE REGIONID > 104  
GO  
-- Example of linked server query (in a SQL Server VIEW)   
  
DROP VIEW QP_CustomerOrders  
  
GO  
  
CREATE VIEW QP_CustomerOrders  
AS  
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.ORDERS  
  
GO  
  
SELECT * FROM QP_CustomerOrders  
  
GO  
  
-- Create SQL Server Stored Procedure to wrap Linked Server Query (SELECT with parameter)   
  
DROP PROCEDURE QP_SP_SelectAreaByAREAID  
  
GO  
  
CREATE PROCEDURE QP_SP_SelectAreaByAREAID  
    @MyArea integer   
AS   
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE AREAID = @MyArea  
  
GO  
  
SP_HELP QP_SP_SelectAreaByAREAID  
  
GO  
  
DECLARE @return_value int  
  
EXEC @return_value = [dbo].[QP_SP_SelectAreaByAREAID]  
    @MyArea = 1581  
  
SELECT 'Return Value' = @return_value  
  
GO  
  
-- Four-part linked server query (INSERT with DUW transaction)  
--(Note: Requires updated Provider String (provstr) argument (Units of Work=DUW)   
  
SET XACT_ABORT ON  
BEGIN DISTRIBUTED TRAN  
INSERT INTO DB2EXAMPLE.DSN1D037.NWIND.AREAS VALUES ('99999', 'Everywhere', 999)  
COMMIT TRAN  
SET XACT_ABORT OFF  
  
-- Test table (SELECT)  
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS  
  
-- Four-part linked server query (UPDATE with DUW transaction)  
SET XACT_ABORT ON  
BEGIN DISTRIBUTED TRAN  
UPDATE DB2EXAMPLE.DSN1D037.NWIND.AREAS SET AREADESC = 'Nowhere' WHERE AREAID = 99999  
COMMIT TRAN  
SET XACT_ABORT OFF  
  
-- Test table (SELECT)  
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS  
  
-- Four-part linked server query (DELETE with DUW transaction)  
SET XACT_ABORT ON  
BEGIN DISTRIBUTED TRAN  
DELETE FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS WHERE AREAID = 99999  
COMMIT TRAN  
SET XACT_ABORT OFF  
  
-- Test table (SELECT)  
SELECT * FROM DB2EXAMPLE.DSN1D037.NWIND.AREAS  
  

パススルー クエリ

SQL Serverは、解釈されていないクエリ文字列としてパススルー クエリを OLE DB データ ソースに送信します。 パススルー クエリは、OLE DB データ ソースが許容する構文に準拠している必要があります。 Transact-SQL ステートメントでは、パススルー クエリの結果が通常のテーブル参照であるかのように使用されます。 OPENROWSET および OPENDATASOURCE の引数は変数をサポートしていません。 引数は文字列リテラルとして指定する必要があります。 変数を引数として渡す必要がある場合、変数が含まれているクエリ文字列を動的に作成し、EXECUTE ステートメントを使用して実行できます。

次のコード フラグメントは、パススルー クエリを作成する構文を示しています。

-- Example of a pass through query (SELECT with parameters)   
  
DECLARE @AMOUNT DECIMAL(9,2);   
SET @AMOUNT = 99.99;  
EXECUTE ('SELECT * FROM NWIND.ORDERS WHERE AMOUNT = ?', @AMOUNT, 'Select') AT DB2EXAMPLE;   
  
GO  
  
-- Example of pass through query to execute DDL statement (DROP PROCEDURE)   
  
EXECUTE ('DROP PROCEDURE NWIND.CUSTORD', 'Drop') AT DB2EXAMPLE;   
  
GO  
  
-- Example of pass through query to execute DDL statement (CREATE PROCEDURE)   
  
EXECUTE ('CREATE PROCEDURE NWIND.CUSTORD (IN CUSTID INT) RESULT SETS 1 LANGUAGE SQL P1: BEGIN DECLARE CURSOR1 CURSOR WITH RETURN FOR SELECT * FROM NWIND.ORDERS WHERE CUSTID = CUSTORD.CUSTID ORDER BY ORDID ASC; OPEN CURSOR1; END P1', 'CreateProc') AT DB2EXAMPLE;   
  
GO  
  
-- Example of pass through query to execute CALL statement (with parameters)   
  
DECLARE @CUSTID INT;   
SET @CUSTID = 10001;  
EXEC ( 'CALL NWIND.CUSTORD(?)', @CUSTID)  AT DB2EXAMPLE;   
  
GO  
  

SQL Server Management Studio

また、SQL Server Management Studioを使用して、リンク サーバークエリという名前の 4 部構成の SELECT、INSERT、UPDATE、DELETE ステートメントを定義することもできます。 これらのクエリは、異種データ ソースで使用できる一般的な Transact-SQL 構文を提供します。

SQL Server Management Studioからリンク サーバーを定義するには、次の手順に従います。

  1. オブジェクト エクスプローラーで、[サーバー オブジェクト] を展開し、[リンク サーバー] フォルダーをクリックし、[新しいリンク サーバー] を右クリックします。

  2. [新しいリンク サーバー] ダイアログ ボックスで、DB2EXAMPLEなどのリンク サーバー名入力し、[プロバイダー] ボックスの一覧から [Microsoft OLE DB Provider for DB2] を選択します。 [製品名] フィールドに「HIS」と入力します。 データ アクセス ツールとデータ ソース ウィザードを使用して定義した有効な接続文字列を [プロバイダー文字列] フィールドに貼り付けます。 [場所] フィールドに DB2 カタログを入力します。

  3. [ページの選択] ウィンドウで、[ セキュリティ ] をクリックし、[ このセキュリティ コンテキストを使用して作成する] を選択します。 [リモート ログイン] に有効な DB2 ユーザー名を入力し、[パスワードあり] にパスワードを入力します

  4. [ページの選択] ウィンドウで、[ サーバー オプション] をクリックし、[ RPC Out ] をクリックし、[True] を選択 します[OK] をクリックします。

  5. リモート サーバーにオブジェクトを表示するには、[ リンク サーバー ] フォルダーを展開し、定義したリンク サーバーを展開し、[ カタログ]、[ テーブル ]、[ビュー] を展開 します

  6. クエリを作成するには、テーブルを右クリックし、 [スクリプト テーブル] を 選択します。 [SELECT to]\(選択\) を選択し、[New クエリ エディター Window]\(新しいクエリ エディター ウィンドウ\) を選択します。

  7. [クエリ] メニューの [ 実行] (F5) をクリックします。 [結果] ウィンドウにデータ行が表示されます。

    リンク サーバー定義を変更したり、他のリンク サーバー定義を作成するためのテンプレートとして使用したりすることもできます。

  8. オブジェクト エクスプローラーで、前に定義したリンク サーバーを右クリックします。 [リンク サーバーをスクリプト化する] を選択し、[ドロップ] と [作成先] を選択し、[新しいクエリ エディター ウィンドウ] をクリックします。

  9. Transact-SQL ステートメントを編集し、[クエリ] メニューの [実行] (F5) をクリックします。

  10. 再定義または新しいリンク サーバーを右クリックし、[ 接続のテスト] をクリックします。

参照

SQL Server