2009-03-03 9 views
10

Ich denke, ich habe das gleiche Problem wie kcrumley beschreibt in der Frage "Problem calling stored procedure from another stored procedure via classic ASP". Doch seine Frage nicht enthalten wirklich eine Lösung, so werde ich einen weiteren Versuch, meine eigenen Beobachtungen und fügte hinzu:MS SQL: Unterdrücken Rückgabewert der gespeicherten Prozedur aufgerufen in gespeicherten Prozedur

ich zwei gespeicherte Prozeduren haben:

CREATE PROCEDURE return_1 AS BEGIN 
    SET NOCOUNT ON; 
    SELECT 1 
END 

CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN 
    SET NOCOUNT ON; 
    EXEC return_1 
    SELECT 2 
END 

Beachten Sie, dass beide Verfahren „SET enthalten NOCOUNT ON ". Wenn ich "call_return_1_and_return_2" ausführe, erhalte ich immer noch zwei Datensätze. Zuerst der Wert 1, dann der Wert 2.

Das wirft ASP (klassisches VBScript ASP) von den Spuren.

Gibt es Hinweise, wie ich die erste Ergebnismenge unterdrücken kann? Warum ist es sogar mit NOCOUNT?

Das Überspringen des ersten Datensatzes in ASP ist keine Option. Ich brauche eine "nur Datenbank" -Lösung.

+0

Ein paar Antworten weisen darauf hin, dass Sie von einem SELECT auf eine RETURN ändern können, aber das ist eine große Frage - was ist, wenn die verschachtelte gespeicherte Prozedur auswählen muss, weil etwas anderes es nennt, und du kannst es nicht ändern? Ich frage mich, ob es möglich ist, ein solches Ergebnis zu "schlucken". –

Antwort

8

Es ist nicht die NOCOUNT, die dies verursacht, Ihre gespeicherten Prozeduren haben eine Auswahl, so dass jede in ihrer eigenen Ergebnismenge kommt. Dies könnte vermieden werden, indem Sie Ihre erste gespeicherte Prozedur so ändern, dass Ausgabeparameter verwendet werden, um die Zahl 1 zurück zu geben, anstatt eine Auswahl zu treffen. Die zweite gespeicherte Prozedur könnte dann den Ausgabeparameter untersuchen, um die Daten zu erhalten, die er ausführen muss.

Probieren Sie etwas wie dieses

CREATE PROCEDURE Proc1 
(
    @RetVal INT OUTPUT 
) 
AS 
SET NOCOUNT ON 
SET @RetVal = 1 


CREATE PROCEDURE Proc2 
AS 
SET NOCOUNT ON 
DECLARE @RetVal int 
EXEC [dbo].[Proc1] 
     @RetVal = @RetVal OUTPUT 
SELECT @RetVal as N'@RetVal' 
2

Das sind keine Variablen zurück, aber Ausgabedatensätzen. Ich schätze, sobald der SQL-Server die Ausgabe an den Client löscht, sind Sie verschraubt und können ihn nicht mehr zurücknehmen.

Ich würde das lösen, indem ich einen Parameter zu SP return_1 hinzufüge, der steuern würde, ob return_1 Datensätze auswählen würde oder einfach Dinge tun und lautlos beenden würde.

12

Wie Matt in seinem Kommentar hervorhebt, "schlucken" keine der beiden Lösungen wirklich die erste Ergebnismenge. Ich weiß nicht, warum Sie das wollen, aber Sie können das Ergebnis der ersten Exec "schlucken", indem Sie eine Tabellenvariable verwenden. Es muss mit der genauen Menge und dem Typ der Spalten des Resultsets übereinstimmen. Wie so:

CREATE PROCEDURE return_1 AS 
    SET NOCOUNT ON; 
    SELECT 1 
GO 
CREATE PROCEDURE call_return_1_and_return_2 AS 
    SET NOCOUNT ON; 
    DECLARE @Result TABLE (res int) 
    insert into @Result EXEC return_1 
    SELECT 2 
GO