Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

T-SQL get SELECTed value of stored procedure

In T-SQL, this is allowed:

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

So, it's possible to get the value of a SELECT and stuff it in a variable (provided it's scalar, obviously).

If I put the same select logic in a stored procedure:

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

Can I get the output of this stored procedure and stuff it in a variable?

Something like:

DECLARE @SelectedValue int SELECT @SelectedValue = EXEC GetMyInt 

(I know the syntax above is not allowed because I tried it!)

like image 307
David Avatar asked May 21 '10 09:05

David


People also ask

Can I call stored procedure in SELECT statement?

We can not directly use stored procedures in a SELECT statement.

Can a procedure return a value?

A stored procedure does not have a return value but can optionally take input, output, or input-output parameters. A stored procedure can return output through any output or input-output parameter.

How can I return multiple values from a stored procedure in SQL?

In order to fetch the multiple returned values from the Stored Procedure, you need to make use of a variable with data type and size same as the Output parameter and pass it as Output parameter using OUTPUT keyword. You can also make use of the Split function to split the comma separated (delimited) values into rows.


2 Answers

there are three ways you can use: the RETURN value, and OUTPUT parameter and a result set

ALSO, watch out if you use the pattern: SELECT @Variable=column FROM table ...

if there are multiple rows returned from the query, your @Variable will only contain the value from the last row returned by the query.

RETURN VALUE
since your query returns an int field, at least based on how you named it. you can use this trick:

CREATE PROCEDURE GetMyInt ( @Param int) AS DECLARE @ReturnValue int  SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN @ReturnValue GO 

and now call your procedure like:

DECLARE @SelectedValue int        ,@Param         int SET @Param=1 EXEC @SelectedValue = GetMyInt @Param PRINT @SelectedValue 

this will only work for INTs, because RETURN can only return a single int value and nulls are converted to a zero.

OUTPUT PARAMETER
you can use an output parameter:

CREATE PROCEDURE GetMyInt ( @Param     int  ,@OutValue  int OUTPUT) AS SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN 0 GO 

and now call your procedure like:

DECLARE @SelectedValue int        ,@Param         int SET @Param=1 EXEC GetMyInt @Param, @SelectedValue OUTPUT PRINT @SelectedValue  

Output parameters can only return one value, but can be any data type

RESULT SET for a result set make the procedure like:

CREATE PROCEDURE GetMyInt ( @Param     int) AS SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN 0 GO 

use it like:

DECLARE @ResultSet table (SelectedValue int) DECLARE @Param int SET @Param=1 INSERT INTO @ResultSet (SelectedValue)     EXEC GetMyInt @Param SELECT * FROM @ResultSet  

result sets can have many rows and many columns of any data type

like image 89
KM. Avatar answered Oct 13 '22 17:10

KM.


There is also a combination, you can use a return value with a recordset:

--Stored Procedure--

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 

--Calling Code--

DECLARE @SelectedValue int EXEC @SelectedValue = [TestProc]   SELECT @SelectedValue 

--Results--

enter image description here

like image 39
markpcasey Avatar answered Oct 13 '22 15:10

markpcasey