クエリ プロセッサ
DB2 の分散クエリのSQL Server
SQL Serverの分散クエリは、複数のデータ ソースへの分散同時アクセスを提供します。 分散クエリ プロセッサ (DQP) を使用すると、SQL Server 内のテーブルを、DB2、ホスト ファイル システム、Oracle、または OLE DB プロバイダーによってアクセス可能な他の任意のデータ ソース内のテーブルと結合する異種クエリを作成することができます。 DQP を使用して、DB2 テーブルを対象とする SQL ビューを作成すると、開発者が、SQL Server に直接書き込み、アプリケーション内で Windows ベースとホスト ベースの両方のデータを統合できるようになります。
次の図は、Host Integration Server (HIS) を使用してデータにアクセスするための DQP アーキテクチャを示しています。
OLE DB データ ソースからデータにアクセスするには、SQL Server次の情報が必要です。
OLE DB プロバイダーの名前
OLE DB 初期化文字列の形式の接続情報
テーブル名または SQL クエリ文字列
承認資格情報
異種データ ソースは、次の 3 つの方法のいずれかを使用して参照できます。
アドホック名
リンク サーバー名
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からリンク サーバーを定義するには、次の手順に従います。
オブジェクト エクスプローラーで、[サーバー オブジェクト] を展開し、[リンク サーバー] フォルダーをクリックし、[新しいリンク サーバー] を右クリックします。
[新しいリンク サーバー] ダイアログ ボックスで、DB2EXAMPLEなどのリンク サーバー名を入力し、[プロバイダー] ボックスの一覧から [Microsoft OLE DB Provider for DB2] を選択します。 [製品名] フィールドに「HIS」と入力します。 データ アクセス ツールとデータ ソース ウィザードを使用して定義した有効な接続文字列を [プロバイダー文字列] フィールドに貼り付けます。 [場所] フィールドに DB2 カタログを入力します。
[ページの選択] ウィンドウで、[ セキュリティ ] をクリックし、[ このセキュリティ コンテキストを使用して作成する] を選択します。 [リモート ログイン] に有効な DB2 ユーザー名を入力し、[パスワードあり] にパスワードを入力します。
[ページの選択] ウィンドウで、[ サーバー オプション] をクリックし、[ RPC Out ] をクリックし、[True] を選択 します。 [OK] をクリックします。
リモート サーバーにオブジェクトを表示するには、[ リンク サーバー ] フォルダーを展開し、定義したリンク サーバーを展開し、[ カタログ]、[ テーブル ]、[ビュー] を展開 します。
クエリを作成するには、テーブルを右クリックし、 [スクリプト テーブル] を 選択します。 [SELECT to]\(選択\) を選択し、[New クエリ エディター Window]\(新しいクエリ エディター ウィンドウ\) を選択します。
[クエリ] メニューの [ 実行] (F5) をクリックします。 [結果] ウィンドウにデータ行が表示されます。
リンク サーバー定義を変更したり、他のリンク サーバー定義を作成するためのテンプレートとして使用したりすることもできます。
オブジェクト エクスプローラーで、前に定義したリンク サーバーを右クリックします。 [リンク サーバーをスクリプト化する] を選択し、[ドロップ] と [作成先] を選択し、[新しいクエリ エディター ウィンドウ] をクリックします。
Transact-SQL ステートメントを編集し、[クエリ] メニューの [実行] (F5) をクリックします。
再定義または新しいリンク サーバーを右クリックし、[ 接続のテスト] をクリックします。