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 ответов
существует три способа использования: возвращаемое значение, выходной параметр и результирующий набор
кроме того, если вы используете шаблон: 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
выходные параметры могут возвращать только одно значение, но могут быть любого типа данных
результат SET для результирующего набора сделайте процедуру как:
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
--результаты--
вам нужно будет использовать возвращаемые значения.
DECLARE @SelectedValue int
CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
затем вы называете это так:
EXEC GetMyInt OUTPUT @SelectedValue