2009-02-20 21 views
16

Ho una procedura memorizzata (la chiameremo A) che chiama un'altra stored procedure (chiameremo questa B). B include un SELECT che non desidero inviare al chiamante di A.Come si eliminano i risultati da una stored procedure da una stored procedure?

Ecco alcuni pseudocodici veramente approssimativi, ma dovrebbe avere l'idea.

PROCEDURE A 
    CURSOR 
     CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B 
    END 
    SELECT * 
END 
PROCEDURE B 
    Do some interesting things 
    SELECT * 
END 

Come potete vedere sopra, A chiama B e B fa alcune cose che voglio e restituisce i risultati che non mi interessano. Una volta che A è pronto, restituisce il proprio insieme di risultati.

Come si sopprimono i risultati da B in A? Sto usando SQL Server 2005. Preferirei non apportare modifiche a B perché funziona e più complesso di quanto non voglia fare.

+0

aggiungere un parametro alla procedura B quindi sa quando saltare il set di risultati, modificare la procedura A quindi utilizza questo nuovo parametro se necessario. –

risposta

29

Si può provare qualcosa di simile:

/* Assume this table matches the output of your procedure */ 
DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue 
EXEC ProcedureB 
+0

Che ha funzionato. Grazie. – Brian

+0

Il mio piacere è contento di aiutare – JoshBerke

+2

Questa è un'ottima soluzione. Ma causa ancora un sovraccarico, vero? Penso che ci dovrebbe essere stata un'opzione come "SET NORESULTSETS ON". Quasi sempre definisco un SP solo per i suoi effetti collaterali e non mi interessa l'output di esso. – ercan

1

mi viene davvero stoopid ma non dovrebbe "fare alcune cose interessanti" essere in un altro procedimento? Quindi la Procedura A chiamerebbe la procedura C (che fa solo "Fa alcune cose interessanti") e poi fa la sua selezione richiesta e la Procedura B potrebbe anche chiamare la procedura C e fare la sua selezione, piuttosto che avere il sovraccarico di una seconda selezione e una temporanea tabella che viene utilizzata solo come pattumiera?

+1

OP "preferirebbe non apportare modifiche a B" – bdukes

+1

+1, le best practice non dovrebbero ottenere un voto negativo. – Chris

+0

È molto comune per un SP che funziona per poi restituire un risultato, come l'id di una riga appena creata. –

0

Ecco una modifica luce della proc A & B che si adatti alle vostre esigenze:

PROCEDURE A 
    CURSOR 
     CREATE TABLE #__suppress_results (col1 int) 
     CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B 
    END 
    SELECT * 
END 
PROCEDURE B 
    Do some interesting things 
    IF OBJECT_ID('tempdb..#__suppress_results') IS NULL BEGIN 
     SELECT * 
    END 
END 

questo modo si evita il problema di nidificato INSERT...EXEC, e conserva il comportamento attuale del proc B. Sulla remota possibilità che qualche altro chiamando proc già crea una tabella temporanea chiamata #__suppress_results prima di chiamare proc B, basta usare un nome diverso, come #[email protected]_results.

E funziona, perché #__suppress_results è visibile all'interno proc B se proc B viene chiamata da proc A.

Problemi correlati