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


В 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

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

4 88

4 ответа:

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

кроме того, если вы используете шаблон: SELECT @Variable=column FROM table ...

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
поскольку ваш запрос возвращает поле 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

это будет работать только для INTs, потому что 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 

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

результат Набор для результирующего набора сделайте процедуру так:

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 

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

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

--Хранимые Процедуры--

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

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

DECLARE @SelectedValue int

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

затем вы называете это так:

EXEC GetMyInt OUTPUT @SelectedValue

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

EXEC @SelectedValue = GetMyInt