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 INSERT
DELETE
, 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.
0 commenti