2010-05-21 5 views
86

In T-SQL, ist dies erlaubt:T-SQL Gewählten Wert der gespeicherten Prozedur erhält

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

So ist es möglich, den Wert eines SELECT und stopft es in einer Variablen zu erhalten (vorausgesetzt, es ist Skalar, offensichtlich).

Stecke ich die gleiche Auswahllogik in einer gespeicherten Prozedur:

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

Kann ich die Ausgabe dieser gespeicherten Prozedur und stopfen es in einer Variablen zu bekommen?

Etwas wie:

DECLARE @SelectedValue int 
SELECT @SelectedValue = EXEC GetMyInt 

(Ich weiß, dass die obige Syntax nicht zulässig ist, weil ich es versucht!)

+0

Es scheint Art schwer die beste Antwort zu wählen, wenn mehrere Ihre Frage wie gefragt beantworten. Ich habe die detaillierteste hier gewählt. Vielen Dank. – David

Antwort

170

gibt es drei Möglichkeiten, die Sie verwenden können: Der Rückgabewert, und OUTPUT-Parameter und eine Ergebnismenge

AUCH, achten Sie, wenn Sie Verwenden Sie das Muster: SELECT @Variable=column FROM table ...

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

UCKGABEWERT
da die Abfrage ein int Feld zurückgibt, zumindest auf, wie Sie es genannt. Sie können diesen Trick anwenden:

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

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

und jetzt Ihr Verfahren wie nennen:

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

dies nur für INTs funktionieren wird, weil RETURN nur einen einzigen int-Wert und Nullen zurückkehren kann auf einen Null umgewandelt werden .

Ausgabeparameter
können Sie 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 Ihr Verfahren wie nennen:

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

Ausgangsparameter nur einen Wert zurückgeben kann, kann aber beliebig sein Datentyp

ERGEBNIS SET für eine Ergebnismenge machen das Verfahren wie:

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

es gerne verwenden:

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

Ergebnismengen viele Reihen und viele Spalten eines beliebigen Datentyps

+2

Beachten Sie, dass die Ergebnissatzmethode diese Tabelle/Einfügeverwendung erfordert, auch wenn nur ein Datensatz zurückgegeben wird. Ich suchte nach einer Verknüpfung direkt in eine Variable, aber es gibt keine. – goodeye

+0

ist es möglich, den Ansatz 'Rückgabewert' und 'Ausgabeparameter' in einem Ergebnis mit mehreren Zeilen zu verwenden? –

+0

@ ji-ruh, eine gespeicherte Prozedur kann eine, keine, einige oder alle verwenden: Ergebnismenge, Rückgabe der Ausgabeparameter und/oder Rückgabewert –

2

Sie bräuchten Rückgabewerte verwenden.

DECLARE @SelectedValue int 

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

Dann rufen Sie es wie folgt aus:

EXEC GetMyInt OUTPUT @SelectedValue 
+0

Sie hängen nicht herum! Danke. – David

+0

Warum kann ich das nicht als Antwort für 10 Minuten markieren? SO ist König der willkürlichen Regel. – David

2

Versuchen Sie dies zu tun haben:

EXEC @SelectedValue = GetMyInt 
+6

Das ist falsch. Eine SELECT-Anweisung wird nicht zum Rückgabewert des SPROC, es sei denn, sie ist in SPROC angegeben. –

4

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

--Stored Procedure--

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 

--Results--

enter image description here

+0

Wie bekomme ich diese Ergebnisse in PHP? – HagaHood