Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come inserire i risultati di una stored procedure in una tabella temporanea in SQL Server

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.