Freigeben über


Abfrageprozessor

Verteilte SQL Server-Abfragen für DB2

Verteilte Abfragen in SQL Server bieten verteilten gleichzeitigen Zugriff auf mehrere Datenquellen. Mit dem DQP (Distributed Query Processor) können Sie heterogene Abfragen erstellen, die Tabellen in SQL Server mit Tabellen in DB2, Hostdateisystemen, Oracle oder einer anderen Datenquelle verknüpfen, auf die von einem OLE DB-Anbieter zugegriffen werden kann. Sie können DQP verwenden, um SQL Server-Ansichten über DB2-Tabellen zu erstellen, sodass Entwickler direkt in SQL Server schreiben und sowohl Windows-basierte als auch hostbasierte Daten in ihre Anwendungen integrieren können.

Das folgende Diagramm zeigt die DQP-Architektur für den Zugriff auf Daten mit Host Integration Server (HIS).

Verteilte SQL Server-Abfragen

Für den Zugriff auf Daten aus einer OLE DB-Datenquelle erfordert SQL Server die folgenden Informationen:

  1. Der Name des OLE DB-Anbieters

  2. Verbindungsinformationen in Form einer OLE DB-Initialisierungszeichenfolge

  3. Der Tabellenname oder die SQL-Abfragezeichenfolge

  4. Autorisierungs-Zugangsdaten

    Sie können mithilfe einer von drei Methoden auf heterogene Datenquellen verweisen:

  5. Ad-hoc-Name

  6. Verknüpfte Servernamen

  7. Pass-Through Abfragen

Ad-hoc-Namensabfragen

Ein Ad-hoc-Name wird für seltene Abfragen für OLE DB-Datenquellen verwendet, die nicht als verknüpfte Server definiert sind. In SQL Server stellen die Funktionen OPENROWSET und OPENDATASOURCE Verbindungsinformationen für den Zugriff auf Daten aus OLE DB-Datenquellen bereit. Ad-hoc-Namen werden standardmäßig nicht unterstützt. Die Anbieteroption "DisallowAdhocAccess " muss auf "0" festgelegt sein, und die erweiterte Ad-Hoc-Konfigurationsoption für verteilte Abfragen muss aktiviert sein.

Im folgenden Codefragment wird die Syntax zum Aktivieren von Ad-hoc-Namensabfragen angezeigt.

-- 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  
  

Das folgende Codefragment zeigt die Syntax zum Erstellen von Ad-hoc-Abfragen an.

Vorsicht

In diesem Beispiel oder Leitfaden wird auf vertrauliche Informationen verwiesen, z. B. auf eine Verbindungszeichenfolge oder einen Benutzernamen und ein Kennwort. Codieren Sie diese Werte niemals in Ihrem Code, und stellen Sie sicher, dass Sie vertrauliche Daten mithilfe der sichersten verfügbaren Authentifizierung schützen. Weitere Informationen finden Sie in der folgenden Dokumentation:

-- 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 und OPENDATASOURCE sollten nur zum Verweisen auf OLE DB-Datenquellen verwendet werden, auf die selten zugegriffen wird. Definieren Sie für alle Datenquellen, auf die mehr als mehrmals zugegriffen wird, einen verknüpften Server. Weder OPENDATASOURCE noch OPENROWSET stellen alle Funktionen von verknüpften Serverdefinitionen bereit. Beispielsweise sind OPENROWSET und OPENDATASOURCE Makros und unterstützen das Bereitstellen Transact-SQL Variablen nicht als Argumente. Ad-hoc-Namensabfragen enthalten keine Sicherheitsverwaltung oder die Möglichkeit, Kataloginformationen abzufragen. Jedes Mal, wenn diese Funktionen aufgerufen werden, müssen alle Verbindungsinformationen, einschließlich Kennwörtern, bereitgestellt werden.

Definieren eines verknüpften Servers

Sie können einen verknüpften Servernamen erstellen, der eine Verbindung mit DB2 definiert, indem Sie Transact-SQL-Anweisungen verwenden oder die Benutzeroberfläche von SQL Server Management Studio nutzen.

Transact-SQL

Das folgende Codefragment veranschaulicht die Transact-SQL-Syntax zum Löschen, Erstellen und Angeben von Authentifizierungsanmeldeinformationen für eine Definition des verknüpften Servernamens.

-- 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  
  

Übergeben von Abfragen

SQL Server sendet Pass-Through-Abfragen als nicht interpretierte Abfragezeichenfolgen an eine OLE DB-Datenquelle. Die Abfrage muss sich in einer Syntax befinden, die von der OLE DB-Datenquelle akzeptiert wird. Eine Transact-SQL-Anweisung verwendet die Ergebnisse einer Pass-Through-Abfrage, als ob es sich um einen regulären Tabellenverweis handeln würde. Die Argumente von OPENROWSET und OPENDATASOURCE unterstützen keine Variablen. Die Argumente müssen als string-Literale angegeben werden. Wenn Variablen als Argumente übergeben werden müssen, kann eine Abfragezeichenfolge, die die Variablen enthält, dynamisch erstellt und mithilfe der EXECUTE-Anweisung ausgeführt werden.

Im folgenden Codefragment wird die Syntax zum Erstellen von Passthrough-Abfragen angezeigt.

-- 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

Sie können SQL Server Management Studio auch verwenden, um SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen zu definieren, die vierteilige benannte Serverabfragen verwenden. Diese Abfragen stellen eine allgemeine Transact-SQL Syntax bereit, die über heterogene Datenquellen verwendet werden kann.

Führen Sie die folgenden Schritte aus, um einen verknüpften Server aus sql Server Management Studio zu definieren:

  1. Erweitern Sie im Objekt-Explorer Serverobjekte, klicken Sie auf den Ordner "Verknüpfte Server ", und klicken Sie dann mit der rechten Maustaste auf "Neuer verknüpfter Server".

  2. Geben Sie im Dialogfeld "Neuer verknüpfter Server" einen Servernamen wie DB2EXAMPLE ein, und wählen Sie in der Liste "Anbieter" den Microsoft OLE DB-Anbieter für DB2 aus. Geben Sie HIS in das Feld "Produktname" ein . Fügen Sie eine gültige Verbindungszeichenfolge, die Sie mithilfe des Datenzugriffstools und des Datenquellen-Assistenten definiert haben, in das Feld "Anbieterzeichenfolge " ein. Geben Sie den DB2-Katalog in das Feld "Ort " ein.

  3. Wählen Sie im Bereich "Seite auswählen" Sicherheit und dann Mit diesem Sicherheitskontext erstellen aus. Geben Sie einen gültigen DB2-Benutzernamen in die Remoteanmeldung und ein Kennwort in "Mit Kennwort" ein.

  4. Klicken Sie im Bereich "Seite auswählen" auf Serveroptionen, klicken Sie auf RPC-Ausgabe und wählen Sie True aus. Klicke auf OK.

  5. Um Objekte auf dem Remoteserver anzuzeigen, erweitern Sie den Ordner "Verknüpfter Server ", erweitern Sie den von Ihnen definierten verknüpften Server, erweitern Sie Kataloge, Tabellen und Ansichten.

  6. Um eine Abfrage zu erstellen, klicken Sie mit der rechten Maustaste auf eine Tabelle, und wählen Sie "Skripttabelle" aus. Wählen Sie SELECT aus, und wählen Sie "Neues Abfrage-Editor-Fenster" aus.

  7. Klicken Sie im Menü "Abfrage" auf "Ausführen" (F5). Die Datenzeilen werden im Ergebnisbereich angezeigt.

    Sie können auch die verknüpfte Serverdefinition ändern oder als Vorlage zum Erstellen anderer verknüpfter Serverdefinitionen verwenden.

  8. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den verknüpften Server, den Sie zuvor definiert haben. Wählen Sie "Skriptverknüpfungsserver" aus, wählen Sie "DROP" und "ERSTELLEN" aus, und klicken Sie auf "Neues Abfrage-Editor-Fenster".

  9. Bearbeiten Sie die Anweisungen Transact-SQL, und klicken Sie im Menü "Abfrage" auf Ausführen (F5).

  10. Klicken Sie mit der rechten Maustaste auf den neu definierten oder neuen verknüpften Server, und klicken Sie dann auf "Verbindung testen".

Siehe auch

SQL Server