2009-02-20 20 views
16

Tengo un procedimiento almacenado (lo llamaremos A) que llama a otro procedimiento almacenado (lo llamaremos B). B incluye un SELECCIONAR que no deseo devolver a la persona que llama de A.¿Cómo suprimo los resultados de un procedimiento almacenado dentro de un procedimiento almacenado?

Aquí hay un pseudocódigo bastante duro, pero debe transmitir la 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 

Como se puede ver arriba, A llama a B y B hace algunas cosas que quiero y devuelve resultados que no me importa. Una vez que A termina, devuelve su propio conjunto de resultados.

¿Cómo puedo suprimir los resultados de B en A? Estoy usando SQL Server 2005. Preferiría no hacer cambios en B porque está funcionando y es más complejo de lo que quiero meterme.

+0

añadir un parámetro para el procedimiento B para que sepa cuándo saltar el conjunto de resultados, modifique el procedimiento A por lo que utiliza esta nuevo parámetro según sea necesario. –

Respuesta

29

Usted puede intentar algo como esto:

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

Eso funcionó. Gracias. – Brian

+0

Me complace ayudarlo – JoshBerke

+2

Esa es una gran solución. Pero todavía causa sobrecarga, ¿no? Creo que debería haber una opción como 'SET NORESULTSETS ON'. Casi siempre llamo a un SP solo por sus efectos secundarios y no estoy interesado en su resultado. – ercan

1

Soy que es muy, muy stoopid pero no debería "hacer algunas cosas interesantes" estar en otro procedimiento? Entonces el Procedimiento A llamaría al procedimiento C (que solo hace "Hacer algunas cosas interesantes") y luego haría su selección requerida y el Procedimiento B también podría llamar al procedimiento C y hacer su selección, en lugar de tener la sobrecarga de un segundo seleccionar y un temporal mesa que solo se usa como cubo de basura?

+1

OP "preferiría no realizar cambios en B" – bdukes

+1

+1, las mejores prácticas no deberían tener un voto negativo. – Chris

+0

Es muy común que un SP haga algún trabajo para devolver un resultado, como el ID de una fila recién creada. –

0

Aquí hay una ligera modificación del proc Un & B que se adapte a sus necesidades:

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 

Esto evita el problema de anidado INSERT...EXEC, y preserva el comportamiento actual de proc B. En la remota posibilidad de que algún otro calling proc ya crea una tabla temporal llamada #__suppress_results antes de llamar a proc B, solo usa un nombre diferente, como #[email protected]_results.

Y funciona, porque #__suppress_results es visible dentro de proc proc B B si se llama desde proc A.

Cuestiones relacionadas