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!)

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


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


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

2

Versuchen Sie Folgendes:

EXEC @SelectedValue = GetMyInt

7
Das ist falsch. Eine SELECT-Anweisung wird nicht zum Rückgabewert des SPROC, es sei denn, dies ist im SPROC angegeben.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.