2009-09-18 68 views
12
CREATE PROCEDURE [test].[proc] 
@ConfiguredContentId int, 
@NumberOfGames int 
AS 
BEGIN 
SET NOCOUNT ON 
RETURN 
@WunNumbers TABLE (WinNumb int) 

    INSERT INTO @WunNumbers (WinNumb) 
SELECT TOP (@NumberOfGames) WinningNumber 
FROM [Game].[Game] g 
JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId] 
WHERE g.[ConfiguredContentId] = @ConfiguredContentId 
ORDER BY g.[Stoptime] DESC 

SELECT WinNumb, COUNT (WinNumb) AS "Count" 
FROM @WunNumbers wn 
GROUP BY wn.[WinNumb] 
END 
GO 

Este procedimiento almacenado devuelve valores de la primera instrucción de selección, pero me gustaría que se devuelvan los valores de la segunda declaración de selección. Table @WunNumbers es una tabla temporal.Cómo devolver la tabla temporal del procedimiento almacenado

¿Alguna idea ???

+0

por favor reformatee el código sql. –

+0

Ese código no es SQL válido. Podría ser, si "RETURN @WinNumbers" fue "DECLARE @WinNumbers", pero el resto parece correcto para devolver el conjunto de resultados finales –

+0

que veo ahora, publiqué un código incorrecto. Hay "DECLARE @WinNumbers" pero todavía no funciona. – dani

Respuesta

6

¿Qué versión de SQL Server estás usando? En SQL Server 2008 puede usar Table Parameters and Table Types.

Un enfoque alternativo es devolver una variable de tabla desde una función definida por el usuario, pero no soy un gran admirador de este método.

puede encontrar un ejemplo here

+0

Estoy usando sql server 2005 – dani

25

Echa un vistazo a este código,

CREATE PROCEDURE Test 

AS 
    DECLARE @tab table (no int, name varchar(30)) 

    insert @tab select eno,ename from emp 

    select * from @tab 
RETURN 
+0

¿Cómo esto devolverá/generará una variable de tabla para la persona que llama? Actualmente devuelve un conjunto de resultados. –

+3

Devuelve el resultado de la instrucción select (pregunta real) que, en este caso, pasa a ser el contenido de la variable de tabla local @tab. – JeffO

+5

si hago 'EXECUTE Test' ¿cómo obtengo acceso a @tab? – whytheq

0

El tipo de retorno de un procedimiento es de tipo int.

También puede devolver conjuntos de resultados (por ejemplo el código hace actualmente) (bueno, también puede enviar mensajes, que son cadenas)

Esos son los únicos "devuelve" que puede hacer. Aunque puede agregar parámetros con valores de tabla a un procedimiento (consulte BOL), solo son de entrada.

Editar:

(O como otra crítica mencionado, también se puede utilizar una tabla de función con valores, en lugar de un procedimiento)

2

Una tabla temporal se puede crear en la persona que llama y luego se rellena a partir de el llamado SP.

create table #GetValuesOutputTable(
    ... 
); 

    exec GetValues; -- populates #GetValuesOutputTable 

    select * from #GetValuesOutputTable; 

Algunas de las ventajas de este enfoque sobre el "exec inserto" es que puede estar anidada y que se puede utilizar como entrada o salida.

Algunas desventajas son que el "argumento" no es público, la creación de tabla existe dentro de cada llamador, y que el nombre de la tabla podría colisionar con otros objetos temporales. Ayuda cuando el nombre de la tabla temporal coincide estrechamente con el nombre de SP y sigue alguna convención.

Yendo un poco más lejos, para tablas de salida solo temporales, el enfoque llamado insert-exec y temp table puede ser soportado simultáneamente por el SP llamado. Esto no ayuda demasiado a encadenar los SP porque la tabla aún debe definirse en la persona que llama pero puede ayudar a simplificar las pruebas desde la línea de cmd o cuando se realiza una llamada externa.

-- The "called" SP 
    declare 
     @returnAsSelect bit = 0; 

    if object_id('tempdb..#GetValuesOutputTable') is null 
    begin 
     set @returnAsSelect = 1; 
     create table #GetValuesOutputTable(
     ... 
    ); 
    end 

    -- populate the table 

    if @returnAsSelect = 1 
     select * from #GetValuesOutputTable; 
0

YES YOU CAN.

En su procedimiento almacenado, rellene la tabla @tbRetour.

Al final de su procedimiento almacenado, se escribe:

SELECT * FROM @tbRetour 

para ejecutar el procedimiento almacenado, se escribe:

USE [...] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[getEnregistrementWithDetails] 
@id_enregistrement_entete = '(guid)' 

GO 
0

En primer lugar crear una mesa real, permanente como una plantilla que tiene el diseño requerido para la tabla temporal devuelta, utilizando una convención de nomenclatura que lo identifica como una plantilla y lo vincula simbólicamente con el SP, por ejemplo, tmp_SPName_Output. Esta tabla nunca contendrá ningún dato.

En el SP, use INSERT para cargar datos en una tabla temporal siguiendo la misma convención de nomenclatura, p. #SPName_Output que se supone que existe. Puede probar su existencia y devolver un error si no es así.

Antes de llamar a la utilización sp este sencillo seleccione para crear la tabla temporal:

SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output; 
EXEC SPName; 
-- Now process records in #SPName_Output; 

Esto tiene estas ventajas:

  • La tabla temporal es local a la sesión actual, a diferencia de ## , por lo que no entrará en conflicto con las llamadas simultáneas al SP desde diferentes sesiones. También se elimina automáticamente cuando está fuera del alcance.
  • La tabla de plantillas se mantiene junto con el SP, por lo que si los cambios son realizados en la salida (por ejemplo, se agregaron nuevas columnas), las llamadas preexistentes del SP no se rompen. La persona que llama no necesita ser cambiada.
  • Puede definir cualquier número de tablas de resultados con nombres diferentes para un SP y llenarlos todos. También puede definir salidas alternativas con diferentes nombres y hacer que el SP compruebe la existencia de las tablas temp para ver qué necesidades deben cumplimentarse.
  • mismo modo, si se realizan cambios importantes, pero que quieren mantener al revés compatibilidad, se puede tener una nueva tabla de la plantilla y la nomenclatura para la versión posterior pero todavía apoyo a la versión anterior mediante la comprobación de los cuales temp mesa de la persona que llama ha creado.
Cuestiones relacionadas