2010-05-21 10 views
86

w T-SQL, to jest dozwolone: ​​T-SQL uzyskać wybranej wartości z procedury przechowywanej

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

Tak, to jest możliwe, aby uzyskać wartość SELECT i rzeczy ją w zmiennej (o ile jest to skalar, oczywiście).

Jeśli mogę umieścić ten sam wybrać logikę w procedurze przechowywanej:

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

mogę znaleźć wyjście z tej procedury przechowywanej i rzeczy ją w zmiennej?

Coś jak:

DECLARE @SelectedValue int 
SELECT @SelectedValue = EXEC GetMyInt 

(wiem składnia powyżej jest niedozwolone, ponieważ próbowałem go!)

+0

Wydaje rodzaj Trudno wybrać "najlepszą" odpowiedź, gdy kilku z nich odpowiada na pytanie. Wybrałem najbardziej szczegółowy tutaj. Dzięki. – David

Odpowiedz

170

istnieją trzy sposoby można użyć: Wartość zwracana, a parametr wyjściowy i zestaw wyników

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

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

RETURN VALUE
ponieważ zapytanie zwraca pola int, przynajmniej na podstawie tego, jak nazwał ją. można użyć tej sztuczki:

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

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

i teraz nazywają swoją procedurę jak:

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

to będzie działać tylko dla INT, ponieważ RETURN można zwrócić tylko jedną wartość int i null są konwertowane do zera .

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 

i teraz nazywają swoją procedurę jak:

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

parametrów wyjściowych może zwrócić tylko jedną wartość, ale może być dowolny typ danych

WYNIK ZESTAW dla zestawu wynikowego zrobić procedura jak:

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

używać 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 może mieć wiele wierszy i liczbę kolumn dowolnego typu danych

+2

Uwaga metoda zestaw wyników wymaga tego użycia tabela/insert, nawet jeśli zwracany jest tylko jeden rekord. Szukałem skrótu bezpośrednio w zmiennej, ale nie ma takiego. – goodeye

+0

czy możliwe jest zastosowanie podejścia "zwracana wartość" i "parametr wyjściowy" w wyniku z wieloma wierszami? –

+0

@ ji-ruh, procedura składowana może używać jednego, żadnego, niektórych lub wszystkich: zestaw wyników, zwracane parametry wyjściowe i/lub wartość zwracana –

2

trzeba by użyć wartości zwracanych.

DECLARE @SelectedValue int 

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

Wtedy to nazwać tak:

EXEC GetMyInt OUTPUT @SelectedValue 
+0

Nie kręcisz się! Dzięki. – David

+0

Dlaczego nie mogę oznaczyć tego jako odpowiedzi przez 10 minut? SO jest królem arbitralnej reguły. – David

2

Spróbuj to zrobić:

EXEC @SelectedValue = GetMyInt 
+6

To jest nieprawidłowe. Instrukcja SELECT nie jest wartością zwracaną przez SPROC, chyba że określono ją w SPROC. –

4

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

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

Jak mogę to uzyskać w php? – HagaHood

Powiązane problemy