In alcuni casi con SQL Server, ci può essere un caso in cui si desidera prendere i dati risultanti da una stored procedure e inserirli in una tabella temporanea da utilizzare in un’altra query. Determinare come realizzare questo compito può essere un po’ difficile, quindi delineeremo brevemente un paio di opzioni, a seconda delle vostre esigenze specifiche e della configurazione del database.

Prima di esaminare i metodi specifici, creiamo una procedura di esempio. Anche se non è particolarmente utile, creiamo la procedura BooksByPrimaryAuthor, che accetta il parametro @PrimaryAuthor e prende i record dalla nostra tabella books dove quel @PrimaryAuthor corrisponde. La dichiarazione di generazione della procedura potrebbe assomigliare a questa:

CREATE PROC BooksByPrimaryAuthor @PrimaryAuthor nvarchar(100)ASBEGIN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;ENDGO

In realtà, quello che vorremmo fare è qualcosa del genere, dove SELECT i dati risultanti dalla nostra procedura e li inseriamo in una tabella temporanea:

SELECT *INTO #tmpSortedBooksFROM EXEC BooksByPrimaryAuthor 'Tolkien'

Il problema è che la sintassi sopra è impropria e non funzionerà. Abbiamo bisogno di un nuovo metodo.

Utilizzando lo statement OPENROWSET

Una possibilità è quella di utilizzare lo statement OPENROWSET, che permette di accedere a dati remoti da una sorgente OLE DB e può essere eseguito direttamente da un altro statement SQL. OPENROWSET è un metodo di connessione e recupero dei dati una tantum, quindi non dovrebbe essere utilizzato per connessioni frequenti (è preferibile collegare i server in quel caso).

OPENROWSET può essere l’obiettivo di qualsiasi INSERTDELETE, o UPDATE dichiarazione, che lo rende ideale per il nostro scopo di “eseguire” la nostra stored procedure ed estrarre i dati nella nostra tabella temporanea.

Prima di usare OPENROWSET, potrebbe essere necessario modificare alcune opzioni di configurazione, in particolare permettendo un accesso ad hoc. Questo può essere configurato utilizzando le seguenti dichiarazioni:

sp_configure 'Show Advanced Options', 1GORECONFIGUREGOsp_configure 'Ad Hoc Distributed Queries', 1GORECONFIGUREGO

Ora possiamo utilizzare OPENROWSET, che ha una sintassi particolare che deve essere rispettata:

OPENROWSET( <PROVIDER_NAME>, <DATA_SOURCE>, <OPTIONS>)

Così, possiamo eseguire la nostra stored procedure attraverso OPENROWSET e passarla alla nostra tabella temporanea così:

Potreste aver bisogno di cambiare i valori PROVIDER_NAME e DATA_SOURCE per i vostri scopi.

Utilizzando una funzione definita dall’utente

Ci sono alcuni lati negativi nel metodo OPENROWSET, vale a dire che richiede permessi/configurazioni ad hoc come abbiamo visto sopra, e inoltre OPENROWSET è in grado di restituire un solo set di risultati (se vengono forniti più set, viene restituito solo il primo).

Quindi, un altro metodo per eseguire questo compito è quello di sostituire efficacemente la stored procedure con una funzione definita dall’utente.

Dal nostro esempio, sarebbe qualcosa del genere:

CREATE FUNCTION BooksByPrimaryAuthor( @PrimaryAuthor nvarchar(100))RETURNS TABLEASRETURN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;GO

Questa funzione può quindi essere usata più o meno nello stesso modo desiderato sopra usando OPENROWSET:

SELECT *INTO #tmpSortedBooksFROM BooksByPrimaryAuthor('Tolkien')

Nel caso in cui abbiate veramente bisogno di una stored procedure, potete anche avvolgere la vostra funzione in una stored procedure.

Categorie: Articles

0 commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *