2012-04-12 11 views
5

Tengo un procedimiento almacenado que devuelve dos selecciones, que utilizo en un informe. El primero seleccione son los datos que se mostrarán en forma de tabla y el segundo están los metadatos para mostrar en la cabeza informe, al igual mostrados abajo:Cómo SELECCIONAR [temp table1] = [subselect 1], [temp table2] = [subselect 2] FROM [Procedimiento almacenado]

CREATE PROCEDURE dbo. GetReport  
@Input INT 
AS 
BEGIN   
    --Get #Metadata  
    -- #Results = f(#Metadata) … compex calculation   
    SELECT * FROM #Results  
    SELECT * FROM #Metadata  
END 

Como el cálculo sproc es bastante intensa, me gusta preparar las líneas del informe como datos sin formato (en dos tablas: PrecalcResults y PrecalcMetadata) para algunos parámetros de sproc utilizados principalmente durante la noche. Espuma seleccionaría directamente los valores precalculados o los calcularía con sproc según los parámetros.

Por razones de mantenimiento me gustaría utilizar el mismo procedimiento almacenado para calcular los datos que serían: 1. no manifestaron en el informe 2. almacenarse en PrecalcResults y PrecalcMetadata (con los parámetros utilizados)

Si yo tendría una función de selección única Me gustaría un enfoque descrito aquí: Insert results of a stored procedure into a temporary table

Como tengo multiprocesamiento sproc me gustaría hacer algo como lo de arriba, pero con dos tablas. En .net, haría DataSet.Tables [0] y DataSet.Tables [1] ..., pero quiero hacerlo en tsql, para ejecutarlo en el trabajo diario.

¿Esto es posible incluso en MS SQL?


Tengo que disculparme, de la respuesta a continuación puedo ver que no estaba muy claro. Me gustaría implementar esta funcionalidad como puro TSQL.

+0

intentar la búsqueda de "varios conjuntos de registros activos" (también conocido como MARS). Tendrá que utilizar el método 'NextRecordset' para pasar de un conjunto de registros al siguiente. – HABO

Respuesta

2

Sí, esto es posible.

It's perfectly fine to return multiple result sets from a single stored procedure as you have suggested.

Su único problema potencial es la limitación de un TableAdapter ser capaz de tirar de los dos conjuntos de resultados del procedimiento almacenado, but there's a very simple work-around for that issue.

+0

a menos que sea una tabla temporal, entonces no se encontrará porque solo existe en el servidor – Taryn

+0

@bluefeet Esa no fue mi experiencia ... eso podría ser un problema con su capa de acceso a datos, o intentar hacer referencia a la tabla temporal en una conexión separada ... Debe ser invisible para el cliente, independientemente de si el origen de una declaración seleccionada es una tabla temporal o no temporal. –

+0

Bueno, depende de cómo lo esté usando, si tiene una tabla temporal que devuelve datos en un proceso almacenado y agrega el procedimiento almacenado a un archivo DataSet.xsd. Mi experiencia es que no tiene conocimiento de la tabla temporal en ese punto, ya que existe en el servidor solo – Taryn

Cuestiones relacionadas