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
выходные параметры могут возвращать только одно значение, но могут быть любого типа данных
результат Набор для результирующего набора сделайте процедуру так:
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
--результаты--