2009-02-20 17 views
16

Mam procedurę składowaną (nazwiemy ją A), która wywołuje inną procedurę przechowywaną (nazwiemy to B). B zawiera SELECT, którego nie chcę odsyłać do abonenta A.Jak wyłączyć wyniki procedury przechowywanej z procedury składowanej?

Oto kilka naprawdę szorstkich pseudokodów, ale powinno się to przekuć na drugą.

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

Jak widać powyżej, A wywołania B i B robi pewne rzeczy, które chcę i zwraca wyniki, których nie obchodzi. Po zakończeniu A zwraca własny zestaw wyników.

Jak tłumić wyniki z B w A? Używam programu SQL Server 2005. Wolałbym nie wprowadzać zmian w B, ponieważ działa i jest bardziej złożony, niż chcę się z tym pogodzić.

+0

dodać parametr do procedury B, więc wie, kiedy należy pominąć zestaw wyników, należy zmodyfikować procedurę A więc to wykorzystuje to nowy parametr w razie potrzeby. –

Odpowiedz

29

Można spróbować czegoś takiego:

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

To działało. Dzięki. – Brian

+0

Cieszę się, że mogę pomóc – JoshBerke

+2

To świetne rozwiązanie. Ale nadal powoduje nadmiar, prawda? Myślę, że powinna istnieć opcja "SET NORESULTSETS ON". Prawie zawsze nazywam SP tylko dla jego efektów ubocznych i nie jestem zainteresowany jego wydajnością. – ercan

1

jestem będąc naprawdę bardzo Stoopid ale nie powinna „Czy kilka ciekawych rzeczy” być w innej procedurze? Następnie procedura A wywołałaby procedurę C (która wykonuje tylko "Zrobić kilka interesujących rzeczy"), a następnie wykonaj wymaganą procedurę wyboru, a procedura B może również wywołać procedurę C i wykonać jej wybór, zamiast mieć narzut na drugi wybór i tymczasowy wybór. stół, który służy tylko jako śmietnik?

+1

OP "wolałby nie wprowadzać zmian w B" – bdukes

+1

+1, Najlepsze praktyki nie powinny być głosowane w dół. – Chris

+0

Bardzo często zdarza się, że SP wykonuje pewną pracę, a następnie zwraca wynik, na przykład id nowo utworzonego wiersza. –

0

Oto lekka modyfikacja proc & B, który będzie odpowiadał Twoim potrzebom:

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 

ten sposób unika się problemu zagnieżdżonego INSERT...EXEC i zachowuje istniejącą zachowanie proc B. Na off szansa, że ​​jakiś inny proc wywołujący już tworzy tabelę tymczasową o nazwie #__suppress_results przed wywołaniem proc B, wystarczy użyć innej nazwy, np. #[email protected]_results.

I to działa, ponieważ #__suppress_results jest widoczny w ciągu proc B, jeśli B proc jest wywoływana z proc A.

Powiązane problemy