2010-05-21 14 views
86

En T-SQL, esto está permitido:T-SQL obtener el valor seleccionado de procedimiento almacenado

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

lo tanto, es posible obtener el valor de un SELECT y meterlo en una variable (siempre y cuando 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 la salida de este procedimiento almacenado y esas cosas en una variable?

Algo así como:

DECLARE @SelectedValue int 
SELECT @SelectedValue = EXEC GetMyInt 

(Sé que la sintaxis anterior no está permitido porque lo probé!)

+0

Parece un poco Es difícil elegir la "mejor" respuesta cuando varios responden a su pregunta como se le preguntó. Elegí la más detallada aquí. Gracias. – David

Respuesta

170

hay tres maneras de usar: el valor de retorno, y el parámetro de salida y un conjunto de resultados

También, ten cuidado si utilice el patrón: SELECT @Variable=column FROM table ...

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

VALOR DEVUELTO
ya que la consulta devuelve un campo int, por lo menos en función de cómo lo nombró. se puede utilizar este truco:

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

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

y ahora llamar a su procedimiento, tales como:

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

esto sólo funcionará para intercepciones, porque RETORNO sólo puede devolver un solo valor int y los nulos se convierten en un 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 llamar a su procedimiento, tales como:

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

Los parámetros de salida sólo puede devolver un valor, pero puede ser cualquier tipo de datos

RESULTADO DE CONFIGURACIÓN para un conjunto de resultados que el procedimiento sea como:

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

usarlo como:

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

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

+2

Tenga en cuenta que el enfoque del conjunto de resultados requiere esta tabla/uso de inserción, incluso si solo se devuelve un registro. Estaba buscando un atajo directamente en una variable, pero no hay uno. – goodeye

+0

¿es posible utilizar el enfoque 'valor de retorno' y 'parámetro de salida' en el resultado de múltiples filas? –

+0

@ 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 –

2

Se necesitaría utilizar valores de retorno.

DECLARE @SelectedValue int 

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

Entonces lo llaman así:

EXEC GetMyInt OUTPUT @SelectedValue 
+0

¡No estás hablando! Gracias. – David

+0

¿Por qué no puedo marcar esto como la respuesta durante 10 minutos? SO es el rey de la regla arbitraria. – David

2

Trate de hacer esto:

EXEC @SelectedValue = GetMyInt 
+6

Esto es incorrecto. Una instrucción SELECT no se convierte en el valor de retorno del SPROC a menos que se especifique dentro del SPROC. –

4

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

--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

+0

¿Cómo obtengo estos resultados en php? – HagaHood

Cuestiones relacionadas