T-SQL obtiene el valor SELECCIONADO del procedimiento almacenado

95

En T-SQL, esto está permitido:

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

Entonces, es posible obtener el valor de un SELECT y meterlo en una variable (siempre que sea escalar, obviamente).

Si pongo la misma lógica de selección en un procedimiento almacenado:

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

¿Puedo obtener el resultado de este procedimiento almacenado y meterlo en una variable?

Algo como:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(¡Sé que la sintaxis anterior no está permitida porque la probé!)

David
fuente

Respuestas:

191

Hay tres formas de usar: el valor RETURN y el parámetro OUTPUT y un conjunto de resultados.

TAMBIÉN, ten cuidado si usas el patrón: SELECT @Variable=column FROM table ...

si hay varias filas devueltas por la consulta, su @Variable solo contendrá el valor de la última fila devuelta por la consulta.

VALOR DEVUELTO
ya que su consulta devuelve un campo int, al menos según cómo lo nombró. puedes usar este truco:

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

y ahora llame a su procedimiento como:

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

esto solo funcionará para INT, porque RETURN solo puede devolver un único valor int y los nulos se convierten a cero.

PARÁMETRO DE SALIDA
puede utilizar un parámetro de salida:

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

y ahora llame a su procedimiento como:

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

Los parámetros de salida solo pueden devolver un valor, pero pueden ser de cualquier tipo de datos

CONJUNTO DE RESULTADOS para un conjunto de resultados haga el procedimiento como:

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

úsalo como:

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

los conjuntos de resultados pueden tener muchas filas y muchas columnas de cualquier tipo de datos

KM.
fuente
5
Tenga en cuenta que el enfoque del conjunto de resultados requiere este uso de tabla / inserción, incluso si solo se devuelve un registro. Estaba buscando un atajo directamente a una variable, pero no hay ninguno.
goodeye
¿Es posible utilizar el enfoque de 'valor de retorno' y 'parámetro de salida' en el resultado de varias filas?
ji-ruh
@ ji-ruh, un procedimiento almacenado puede usar uno, ninguno, algunos o todos: conjunto de resultados, parámetros de salida de retorno y / o valor de retorno
KM.
4

También hay una combinación, puede usar un valor de retorno con un conjunto de registros:

--Procedimiento almacenado--

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

--Código de llamada--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Resultados--

ingrese la descripción de la imagen aquí

Markpcasey
fuente
¿Cómo obtengo estos resultados en php?
HagaHood
3

Necesitaría usar valores de retorno.

DECLARE @SelectedValue int

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

Entonces lo llamas así:

EXEC GetMyInt OUTPUT @SelectedValue

fuente
2

Intenta hacer esto:

EXEC @SelectedValue = GetMyInt
Código Wolfe
fuente
7
Esto es incorrecto. Una instrucción SELECT no se convierte en el valor de retorno de SPROC a menos que se especifique dentro de SPROC.