T-SQL erhält den SELECTED-Wert der gespeicherten Prozedur

95

In T-SQL ist dies zulässig:

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Es ist also möglich, den Wert eines SELECT abzurufen und in eine Variable einzufügen (vorausgesetzt, es ist offensichtlich skalar).

Wenn ich dieselbe Auswahllogik in eine gespeicherte Prozedur einfüge:

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Kann ich die Ausgabe dieser gespeicherten Prozedur abrufen und in eine Variable einfügen?

Etwas wie:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Ich weiß, dass die obige Syntax nicht erlaubt ist, weil ich es versucht habe!)

David
quelle

Antworten:

191

Es gibt drei Möglichkeiten, die Sie verwenden können: den Wert RETURN, den Parameter OUTPUT und eine Ergebnismenge

Achten Sie auch darauf, wenn Sie das Muster verwenden: SELECT @Variable=column FROM table ...

Wenn von der Abfrage mehrere Zeilen zurückgegeben werden, enthält Ihre @Variable nur den Wert der letzten von der Abfrage zurückgegebenen Zeile.

RETURN VALUE,
da Ihre Abfrage ein int-Feld zurückgibt, zumindest basierend darauf, wie Sie es benannt haben. Sie können diesen Trick verwenden:

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

und jetzt rufen Sie Ihre Prozedur wie folgt auf:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue

Dies funktioniert nur für INTs, da RETURN nur einen einzelnen int-Wert zurückgeben kann und Nullen in eine Null konvertiert werden.

AUSGABEPARAMETER
Sie können einen Ausgabeparameter verwenden:

CREATE PROCEDURE GetMyInt
( @Param     int
 ,@OutValue  int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

und jetzt rufen Sie Ihre Prozedur wie folgt auf:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 

Ausgabeparameter können nur einen Wert zurückgeben, können jedoch einen beliebigen Datentyp haben

ERGEBNIS-SET für eine Ergebnismenge gehen Sie wie folgt vor :

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

benutze es wie:

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 

Ergebnismengen können viele Zeilen und viele Spalten eines beliebigen Datentyps enthalten

KM.
quelle
5
Beachten Sie, dass für den Ergebnismengenansatz die Verwendung dieser Tabelle / Einfügung erforderlich ist, auch wenn nur ein Datensatz zurückgegeben wird. Ich habe nach einer Verknüpfung direkt in eine Variable gesucht, aber es gibt keine.
Goodeye
Ist es möglich, den Ansatz "Rückgabewert" und "Ausgabeparameter" in mehrzeiligen Ergebnissen zu verwenden?
Ji-Ruh
@ ji-ruh, eine gespeicherte Prozedur kann eine, keine, einige oder alle verwenden: Ergebnismenge, Rückgabeparameter und / oder Rückgabewert
KM.
4

Es gibt auch eine Kombination, Sie können einen Rückgabewert mit einem Recordset verwenden:

--Gespeicherte Prozedur--

CREATE PROCEDURE [TestProc]

AS
BEGIN

    DECLARE @Temp TABLE
    (
        [Name] VARCHAR(50)
    )

    INSERT INTO @Temp VALUES ('Mark') 
    INSERT INTO @Temp VALUES ('John') 
    INSERT INTO @Temp VALUES ('Jane') 
    INSERT INTO @Temp VALUES ('Mary') 

    -- Get recordset
    SELECT * FROM @Temp

    DECLARE @ReturnValue INT
    SELECT @ReturnValue = COUNT([Name]) FROM @Temp

    -- Return count
    RETURN @ReturnValue

END

--Calling Code--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Ergebnisse--

Geben Sie hier die Bildbeschreibung ein

markpcasey
quelle
Wie bekomme ich diese Ergebnisse in PHP?
HagaHood
3

Sie müssten Rückgabewerte verwenden.

DECLARE @SelectedValue int

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Dann nennst du es so:

EXEC GetMyInt OUTPUT @SelectedValue

quelle
2

Versuchen Sie Folgendes:

EXEC @SelectedValue = GetMyInt
Code Wolfe
quelle
7
Das ist falsch. Eine SELECT-Anweisung wird nicht zum Rückgabewert des SPROC, es sei denn, dies ist im SPROC angegeben.