Condividi tramite


Elaboratore di Query

Query distribuite di SQL Server per DB2

Le query distribuite in SQL Server forniscono l'accesso simultaneo distribuito a più origini dati. Distributed Query Processor (DQP) consente di creare query eterogenee che uniscono tabelle in SQL Server con tabelle in DB2, File system host, Oracle o qualsiasi altra origine dati accessibile da un provider OLE DB. È possibile usare DQP per creare viste di SQL Server su tabelle DB2 in modo che gli sviluppatori possano scrivere direttamente in SQL Server e integrare dati basati su Windows e basati su host nelle applicazioni.

Il diagramma seguente illustra l'architettura DQP per l'accesso ai dati con Host Integration Server (HIS).

Query distribuite di SQL Server

Per accedere ai dati da un'origine dati OLE DB, SQL Server richiede le informazioni seguenti:

  1. Nome del provider OLE DB

  2. Informazioni di connessione sotto forma di stringa di inizializzazione OLE DB

  3. Il nome della tabella o la stringa di query SQL

  4. Credenziali di autorizzazione

    È possibile fare riferimento a origini dati eterogenee usando uno dei tre metodi seguenti:

  5. Nome ad hoc

  6. Nomi dei server collegati

  7. Interrogazioni Pass-Through

Query ad hoc con nome

Un nome ad hoc viene usato per le query poco frequenti sulle origini dati OLE DB non definite come server collegati. In SQL Server le funzioni OPENROWSET e OPENDATASOURCE forniscono informazioni di connessione per l'accesso ai dati dalle origini dati OLE DB. Per impostazione predefinita, i nomi ad hoc non sono supportati. L'opzione del provider DisallowAdhocAccess deve essere impostata su 0 e l'opzione di configurazione avanzata Ad Hoc Distributed Queries deve essere abilitata.

Nel frammento di codice seguente viene visualizzata la sintassi per abilitare query con nome ad hoc.

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

Nel frammento di codice seguente viene visualizzata la sintassi per la creazione di query ad hoc.

Attenzione

Questo esempio o materiale sussidiario fa riferimento a informazioni riservate, ad esempio una stringa di connessione o un nome utente e una password. Non inserire mai questi valori come valori codificati nel codice e assicurati di proteggere i dati riservati utilizzando l'autenticazione più sicura disponibile. Per altre informazioni, consultare la documentazione seguente:

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

È consigliabile usare OPENROWSET e OPENDATASOURCE solo per fare riferimento a origini dati OLE DB a cui si accede raramente. Per qualsiasi fonte di dati a cui si accede più di alcune volte, definire un server collegato. Né OPENDATASOURCE né OPENROWSET forniscono tutte le funzionalità delle definizioni del server collegato. Ad esempio, OPENROWSET e OPENDATASOURCE sono macro e non supportano la fornitura di variabili Transact-SQL come argomenti. Le query sui nomi ad hoc non includono la gestione della sicurezza o la possibilità di eseguire query sulle informazioni del catalogo. Ogni volta che queste funzioni vengono chiamate, è necessario specificare tutte le informazioni di connessione, incluse le password.

Definire un server collegato

È possibile creare un nome del server collegato che definisce una connessione a DB2 usando istruzioni Transact-SQL o tramite l'interfaccia utente di SQL Server Management Studio.

Transact-SQL

Il frammento di codice seguente illustra la sintassi Transact-SQL per eliminare, creare e specificare le credenziali di autenticazione per una definizione del nome del server collegato.

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

Query di passaggio

SQL Server invia query pass-through come stringhe di query non interpretate a un'origine dati OLE DB. La query deve trovarsi in una sintassi che l'origine dati OLE DB accetterà. Un'istruzione Transact-SQL utilizza i risultati di una query pass-through come se fossero un riferimento di tabella normale. Gli argomenti di OPENROWSET e OPENDATASOURCE non supportano le variabili. Gli argomenti devono essere specificati come valori letterali stringa. Se le variabili devono essere passate come argomenti, una stringa di query che contiene le variabili può essere costruita in modo dinamico ed eseguita usando l'istruzione EXECUTE.

Nel frammento di codice seguente viene visualizzata la sintassi che crea query pass-through.

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

È anche possibile usare SQL Server Management Studio per definire istruzioni SELECT, INSERT, UPDATE e DELETE che usano query server collegate denominate in quattro parti. Queste query forniscono una sintassi di Transact-SQL comune che può essere usata su origini dati eterogenee.

Seguire questa procedura per definire un server collegato da SQL Server Management Studio:

  1. In Esplora oggetti espandere Oggetti server, fare clic sulla cartella Server collegati e quindi fare clic con il pulsante destro del mouse su Nuovo server collegato.

  2. Nella finestra di dialogo Nuovo server collegato immettere un nome di server collegato, ad esempio DB2EXAMPLE, e selezionare Provider Microsoft OLE DB per DB2 dall'elenco Provider . Immettere HIS nel campo Nome prodotto . Incolla una stringa di connessione valida che hai definito utilizzando lo Strumento di accesso ai dati e la Creazione guidata per l'origine dati nel campo stringa provider. Immettere il catalogo DB2 nel campo Percorso .

  3. Nel riquadro Selezionare una pagina fare clic su Sicurezza e selezionare Crea usando questo contesto di sicurezza. Immettere un nome utente DB2 valido in Accesso remoto e una password in Con password.

  4. Nel riquadro Seleziona una pagina fare clic su Opzioni server, fare clic su Rpc Out e selezionare True. Fare clic su OK.

  5. Per visualizzare gli oggetti nel server remoto, espandere la cartella Server collegato , espandere il server collegato definito, espandere Cataloghi, tabelle e viste.

  6. Per creare una query, fare clic con il pulsante destro del mouse su una tabella e selezionare Script tabella come. Scegliere SELECT per e selezionare Nuova finestra dell'editor di query.

  7. Scegliere Esegui (F5) dal menu Query. Nel riquadro Risultati verranno visualizzate le righe di dati.

    È anche possibile modificare la definizione del server collegato o usarla come modello per la creazione di altre definizioni di server collegati.

  8. In Esplora oggetti fare clic con il pulsante destro del mouse sul server collegato definito in precedenza. Selezionare Script Server collegato come, scegliere DROP e CREA in e fare clic su Nuova finestra dell'editor di query.

  9. Modificare le istruzioni Transact-SQL e fare clic su Esegui (F5) dal menu Query.

  10. Fare clic con il pulsante destro del mouse sul server ricreato o sul nuovo server collegato e quindi scegliere Test Connessione.

Vedere anche

SQL Server