2010-05-21 3 views
86

В T-SQL, это разрешено:T-SQL получить выбранное значение хранимой процедуры

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

Таким образом, можно получить значение ОТБОРНОЕ и вещи его в переменной (при условии, что это скаляр, очевидно).

Если я ставлю ту же логику выбора в хранимой процедуре:

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

Могу ли я получить вывод этой хранимой процедуры и прочее в переменной?

Что-то вроде:

DECLARE @SelectedValue int 
SELECT @SelectedValue = EXEC GetMyInt 

(я знаю, что выше синтаксис не допускается, потому что я пробовал!)

+0

Кажется, вид трудно выбрать «лучший» ответ, когда несколько ответят на ваш вопрос, как было задано. Я выбрал наиболее подробный здесь. Благодарю. – David

ответ

170

Есть три способа, которые можно использовать: Возвращаемое значение, и выходной параметр и результирующий набор

ТАКЖЕ, посмотреть, если вы используйте шаблон: SELECT @Variable=column FROM table ...

Если в запросе есть несколько строк, то ваш @Variable будет содержать только значение из последней строки, возвращаемой запросом.

ВОЗВРАТ СТОИМОСТИ
, поскольку ваш запрос возвращает поле целого типа, по крайней мере, на основе того, как вы назвали его. Вы можете использовать этот трюк:

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

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

и теперь называют вашу процедуру, как:

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

это будет работать только для типа INT, поскольку RETURN может возвращать только одно значение INT и обнуляет преобразуются в ноль ,

OUTPUT ПАРАМЕТР
вы можете использовать выходной параметр:

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

и теперь называют вашу процедуру, как:

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

Выходные параметры могут возвращать только одно значение, но может быть любой тип данных

КОМПЛЕКТ РЕЗУЛЬТАТА для результирующего набора сделать процедуру как:

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

использовать его как:

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

результирующие наборы могут иметь множество строк и множество столбцов данных любого типа

+2

Обратите внимание, что для подхода к набору результатов требуется использование этой таблицы/вставки, даже если возвращается только одна запись. Я искал ярлык непосредственно в переменной, но ее нет. – goodeye

+0

можно использовать подход «возвращаемое значение» и «выходной параметр» в результате нескольких строк? –

+0

@ ji-ruh, хранимая процедура может использовать один, ни один, некоторые или все: набор результатов, возвращаемые выходные параметры и/или возвращаемое значение –

2

Вы должны были бы использовать возвращаемые значения.

DECLARE @SelectedValue int 

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

Тогда вы называете это так:

EXEC GetMyInt OUTPUT @SelectedValue 
+0

Ты не висешь! Спасибо. – David

+0

Почему я не могу отметить это как ответ в течение 10 минут? SO - король произвольного правила. – David

2

Попробуйте сделать это:

EXEC @SelectedValue = GetMyInt 
+6

Это неверно. Оператор SELECT не становится возвращаемым значением SPROC, если не указано внутри SPROC. – 2013-02-26 01:40:00

4

Существует также комбинация, вы можете использовать возвращаемое значение с: записей

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

Как получить этот результат в php? – HagaHood

Смежные вопросы