SQL: come usare l’output di una Stored Procedure SQL in una nuova Query

Avete una Stored Procedure SQL e volete usarne l’output in un’altra query (senza modificare la SP originale). Ecco come fare.

Vi sarà capitato di voler usare l’output di una Stored Procedure in un’altra query; la prima cosa che viene in mente è di modificare o duplicare la SP originale e inserire dei parametri OUTPUT, per poi sfruttarli.

Ma non sempre si può; a volte, infatti, soprattutto in ambienti complessi, certe SP non si possono toccare, perché sono usate da altre procedure o gestite da altri sviluppatori.

Cosa fare allora?

Supponiamo di avere una SP che elenca tutti i clienti di una determinata provincia

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE usp_ClientiProvincia (@p_Provincia VARCHAR(2))

SET NOCOUNT ON

SELECT CODICE, DESCRIZIONE
FROM CLIENTI
WHERE PROVINCIA = @p_PROVINCIA
ORDER BY 1

una SP davvero semplice.

Se la facciamo girare, otteniamo due campi, CODICE e DESCRIZIONE.

Nella nostra nuova query dichiariamo innanzitutto una variabile TABLE che possa contenere il risultato della SP

DECLARE @ClientiTable TABLE (CODICE VARCHAR(20), DESCRIZIONE VARCHAR(100))

Ovviamente la struttura della variabile varierà in base al variare dell’output della SP che volete catturare.
Per memorizzare l’output della SP usiamo una comune INSERT INTO nella forma breve (INSERT INTO SELECT …), specificando anche i parameti per la SP da cattuare.

INSERT INTO @ClientiTable EXEC usp_ClientiProvincia @p_PROVINCIA='MI'

A questo punto ci ritroviamo nella variabile @ClientiTable l’output della SP, pronta per essere utilizzata per i nostri scopi; ad esempio:

SELECT * FROM @ClientiTable WHERE DESCRIZIONE LIKE @p_cerca

Questa la query complessiva

DECLARE @ClientiTable TABLE (CODICE VARCHAR(20), DESCRIZIONE VARCHAR(100))
INSERT INTO @ClientiTable EXEC usp_ClientiProvincia @p_PROVINCIA='MI'
SELECT * FROM @ClientiTable WHERE DESCRIZIONE LIKE @p_cerca

Lascia un commento

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