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

В 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

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

Ответ 1

существует три способа использования: значение 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, а нули преобразуются в ноль.

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

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 

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

SET RESULT для набора результатов выполните следующую процедуру:

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

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

- Сохраненная процедура -

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

- Результаты -

enter image description here

Ответ 3

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

DECLARE @SelectedValue int

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

Затем вы вызываете его так:

EXEC GetMyInt OUTPUT @SelectedValue

Ответ 4

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

EXEC @SelectedValue = GetMyInt