In alcuni casi con SQL Server, potrebbe esserci un'istanza in cui si desidera prelevare i dati risultanti da una stored procedure e inserirli in una tabella temporanea da utilizzare in un'altra query. Determinare come portare a termine questa attività può essere alquanto difficile, quindi delineeremo brevemente un paio di opzioni, a seconda delle tue esigenze specifiche e della configurazione del database.
Prima di esaminare i metodi specifici, creiamo una procedura di esempio. Anche se non particolarmente utile, creiamo il BooksByPrimaryAuthor
procedura, che accetta il @PrimaryAuthor
parametro e acquisisce i record dai nostri books
tabella dove quel @PrimaryAuthor
partite. L'istruzione di generazione della procedura potrebbe essere simile a questa:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Idealmente, ciò che vorremmo fare è qualcosa del genere, in cui SELECT
i dati risultanti dalla nostra procedura e inserirli in una tabella temporanea:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Il problema è la sintassi di cui sopra non è corretta e non funzionerà . Abbiamo bisogno di un nuovo metodo.
Utilizzo dell'istruzione OPENROWSET
Una possibilità è usare il OPENROWSET
istruzione, che consente di accedere a dati remoti da un'origine OLE DB e può essere eseguita direttamente da un'altra istruzione SQL. OPENROWSET
è un metodo di connessione e recupero dati una tantum, quindi non dovrebbe essere utilizzato per connessioni frequenti (in tal caso è preferibile collegare i server).
OPENROWSET
può essere la destinazione di qualsiasi INSERT
, DELETE
o UPDATE
istruzione, che lo rende ideale per i nostri scopi di "eseguire" la nostra procedura memorizzata per noi ed estrarre quei dati nella nostra tabella temporanea in attesa.
Prima di utilizzare OPENROWSET
, potrebbe essere necessario modificare alcune opzioni di configurazione, in particolare consentendo accessi ad hoc. Questo può essere configurato utilizzando le seguenti istruzioni:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Ora possiamo utilizzare OPENROWSET
, che ha una sintassi particolare che deve essere rispettata:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Pertanto, possiamo eseguire la nostra procedura memorizzata tramite OPENROWSET
e passalo alla nostra tabella temporanea in questo modo:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Potrebbe essere necessario modificare il PROVIDER_NAME
e DATA_SOURCE
valori per i tuoi scopi.
Utilizzo di una funzione definita dall'utente
Ci sono alcuni aspetti negativi di OPENROWSET
metodo, ovvero che richiede autorizzazioni/configurazioni ad hoc come abbiamo visto sopra, e anche OPENROWSET
è in grado di restituire un solo set di risultati (se vengono forniti più set, viene restituito solo il primo set di risultati).
Pertanto, un altro metodo per eseguire questa attività consiste nel sostituire efficacemente la stored procedure con una funzione definita dall'utente.
Dal nostro esempio, sarebbe simile a questo:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Questa funzione può quindi essere utilizzata più o meno nello stesso modo desiderato sopra utilizzando OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
Nel caso in cui tu abbia veramente bisogno di una stored procedure, puoi anche racchiudere la tua funzione all'interno di una stored procedure.