T-SQL pobiera wybraną wartość procedury składowanej

95

W T-SQL jest to dozwolone:

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

Zatem możliwe jest pobranie wartości SELECT i umieszczenie jej w zmiennej (oczywiście pod warunkiem, że jest skalarna).

Jeśli umieszczę tę samą logikę wyboru w procedurze składowanej:

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

Czy mogę uzyskać dane wyjściowe tej procedury składowanej i umieścić je w zmiennej?

Coś jak:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Wiem, że powyższa składnia jest niedozwolona, ​​ponieważ próbowałem!)

David
źródło

Odpowiedzi:

192

można użyć trzech sposobów: wartości POWRÓT, parametru WYJŚCIE i zestawu wyników

RÓWNIEŻ uważaj jeśli używasz wzoru: SELECT @Variable=column FROM table ...

jeśli zapytanie zwraca wiele wierszy, twoja @Variable będzie zawierała tylko wartość z ostatniego wiersza zwróconego przez zapytanie.

WARTOŚĆ ZWRACANA,
ponieważ zapytanie zwraca pole typu int, przynajmniej w oparciu o jego nazwę. możesz użyć tej sztuczki:

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

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

a teraz wywołaj swoją procedurę w następujący sposób:

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

zadziała to tylko dla INT, ponieważ RETURN może zwrócić tylko jedną wartość int, a wartości null są konwertowane na zero.

PARAMETR WYJŚCIOWY
można użyć parametru wyjściowego:

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

a teraz wywołaj swoją procedurę w następujący sposób:

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

Parametry wyjściowe mogą zwracać tylko jedną wartość, ale mogą być danymi dowolnego typu

RESULT SET dla zestawu wynikowego wykonaj procedurę:

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

użyj go jak:

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

zestawy wyników mogą mieć wiele wierszy i wiele kolumn dowolnego typu danych

KM.
źródło
5
Należy zauważyć, że podejście do zestawu wyników wymaga użycia tej tabeli / wstawiania, nawet jeśli zwracany jest tylko jeden rekord. Szukałem skrótu bezpośrednio do zmiennej, ale takiego nie ma.
goodeye
czy można zastosować podejście „wartość zwracana” i „parametr wyjściowy” w wyniku z wieloma wierszami?
ji-ruh
@ ji-ruh, procedura składowana może używać one, none, some lub all: zestaw wyników, zwracane parametry wyjściowe i / lub zwracana wartość
KM.
4

Istnieje również kombinacja, możesz użyć wartości zwracanej z zestawem rekordów:

--Procedura składowana--

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

- Kod wywoławczy -

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Wyniki--

wprowadź opis obrazu tutaj

markpcasey
źródło
Jak uzyskać te wyniki w PHP?
HagaHood
3

Musisz użyć wartości zwracanych.

DECLARE @SelectedValue int

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

Następnie nazywasz to tak:

EXEC GetMyInt OUTPUT @SelectedValue

źródło
2

Spróbuj to zrobić:

EXEC @SelectedValue = GetMyInt
Kod Wolfe
źródło
7
To jest niepoprawne. Instrukcja SELECT nie staje się wartością zwracaną przez SPROC, chyba że zostanie określona wewnątrz SPROC.