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

95

В T-SQL это разрешено:

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

Итак, можно получить значение SELECT и поместить его в переменную (при условии, что это скаляр, очевидно).

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

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

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

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

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

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

Дэвид
источник

Ответы:

191

можно использовать три способа: значение RETURN, параметр OUTPUT и набор результатов.

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

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

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

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 PARAMETER
вы можете использовать выходной параметр:

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 

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

КМ.
источник
5
Обратите внимание, что подход с набором результатов требует использования этой таблицы / вставки, даже если возвращается только одна запись. Я искал ярлык непосредственно для переменной, но его нет.
goodeye 09
Можно ли использовать подход «возвращаемое значение» и «выходной параметр» в многострочном результате?
ji-ruh
@ ji-ruh, хранимая процедура может использовать один, ни один, некоторые или все: набор результатов, возвращаемые выходные параметры и / или возвращаемое значение
KM.
4

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

--Хранимая процедура--

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

- Телефонный код -

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Полученные результаты--

введите описание изображения здесь

Markpcasey
источник
Как мне получить этот результат на php?
HagaHood
3

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

DECLARE @SelectedValue int

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

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

EXEC GetMyInt OUTPUT @SelectedValue

источник
2

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

EXEC @SelectedValue = GetMyInt
Код Вулф
источник
7
Это неверно. Оператор SELECT не становится возвращаемым значением SPROC, если он не указан внутри SPROC.