15 Stimmen

MS SQL: Rückgabewert einer gespeicherten Prozedur, die in einer gespeicherten Prozedur aufgerufen wird, unterdrücken

Ich glaube, ich habe das gleiche Problem, das kcrumley in der Frage " Problem beim Aufrufen einer gespeicherten Prozedur aus einer anderen gespeicherten Prozedur über Classic ASP ". Allerdings enthält seine Frage nicht wirklich eine Lösung, also werde ich es noch einmal versuchen und meine eigenen Beobachtungen hinzufügen:

Ich habe zwei gespeicherte Verfahren:

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 Prozeduren "SET NOCOUNT ON" enthalten. Wenn ich "call_return_1_and_return_2" ausführe, erhalte ich immer noch zwei Datensätze. Zuerst den Wert 1, dann den Wert 2.

Das wirft ASP (klassisches VBScript ASP) aus der Bahn.

Haben Sie einen Tipp, wie ich die erste Ergebnismenge unterdrücken kann? Warum ist sie auch mit NOCOUNT vorhanden?

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

1 Stimmen

Einige Antworten weisen darauf hin, dass Sie von einem SELECT zu einem RETURN wechseln können, aber das ist eine gute Frage - was ist, wenn der verschachtelte Stored Proc SELECT sein muss, weil er von etwas anderem aufgerufen wird, und Sie ihn nicht ändern können? Ich frage mich, ob es möglich ist, eine solche Ergebnismenge zu "verschlucken".

17voto

edosoft Punkte 16631

Wie Matt in seinem Kommentar hervorhebt, "schlucken" beide Lösungen nicht wirklich die erste Ergebnismenge. Ich weiß nicht, warum Sie das wollen, aber Sie können das Ergebnis der ersten Ausführung "schlucken", indem Sie eine Tabellenvariable verwenden. Sie muss genau mit der Anzahl und dem Typ der Spalten der Ergebnismenge übereinstimmen. Etwa 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

10voto

Gavin Punkte 16443

Seine nicht die NOCOUNT, die dies verursacht, Ihre gespeicherten Prozeduren haben ein Select jeder so jeder in seine eigene Ergebnismenge kommt. Dies könnte vermieden werden, indem Sie Ihre erste gespeicherte Prozedur so ändern, dass sie Ausgabeparameter verwendet, um die Zahl 1 zurückzugeben, anstatt eine Auswahl zu treffen. Die zweite gespeicherte Prozedur könnte dann den Ausgabeparameter untersuchen, um die Daten zu erhalten, die sie zur Ausführung benötigt.

Versuchen Sie etwas wie dies

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'

2voto

Axarydax Punkte 16025

Dies sind keine Rückgabevariablen, sondern Ausgabedatensätze. Ich vermute, sobald der SQL-Server die Ausgabe an den Client weiterleitet, sind Sie aufgeschmissen und können sie nicht mehr zurückholen.

Ich würde dieses Problem lösen, indem ich einen Parameter zu SP return_1 hinzufüge, der steuert, ob return_1 Datensätze auswählt oder nur etwas tut und stillschweigend beendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X