2011-02-03 21 views
16

Tengo dos procedimientos almacenados, uno de los cuales devuelve una lista de pagos, mientras que el otro devuelve un resumen de esos pagos, agrupados por moneda. En este momento, tengo una consulta duplicada: la consulta principal del procedimiento almacenado que devuelve la lista de pagos es una subconsulta del procedimiento almacenado que devuelve el resumen de pagos por moneda. Me gustaría eliminar esta duplicidad haciendo que el procedimiento almacenado que devuelve la lista de pagos sea una subconsulta del procedimiento almacenado que devuelve el resumen de pagos por moneda. ¿Es eso posible en SQL Server 2008?¿Es posible utilizar un procedimiento almacenado como subconsulta en SQL Server 2008?

Respuesta

15

Le conviene más convertir el primer proc en una función TABLE-VALUEED. Si se trata de varias instrucciones, primero debe definir la estructura de la tabla de retorno y rellenarla.

muestra:

CREATE proc getRecords @t char(1) 
as 
set nocouut on; 
-- other statements -- 
-- final select 
select * from master..spt_values where type = @t 
GO 

- se convierte en -

CREATE FUNCTION fn_getRecords(@t char(1)) 
returns @output table(
    name sysname, 
    number int, 
    type char(1), 
    low int, 
    high int, 
    status int) as 
begin 
-- other statements -- 
-- final select 
insert @output 
select * from master..spt_values where type = @t 
return 
end; 

Sin embargo, si se trata de un selecto recta (o puede escribirse como una sola instrucción), entonces se puede utilizar la LÍNEA forma tvf, que está muy optimizado

CREATE FUNCTION fn2_getRecords(@t char(1)) 
returns table as return 
-- **NO** other statements; single statement table -- 
select * from master..spt_values where type = @t 

el segundo proc simplemente selecciona a partir de la primera proc

create proc getRecordsByStatus @t char(1) 
as 
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t) 
group by status 

Y en la que solía llamar

EXEC firstProc @param 

para obtener un resultado, ahora selecciona de ella

SELECT * FROM firstProc(@param) 
+0

¿Qué sucede cuando su procedimiento almacenado necesita ejecutarse OPENQUERY en un CUBE? No puedes hacer eso desde dentro de una función. –

6

Puede capturar el resultado de un procedimiento almacenado en una tabla temporal y luego usar la tabla en su consulta principal.

Capture la salida de un procedimiento almacenado devolviendo las columnas ID y Nombre a una variable de tabla.

declare @T table (ID int, Name nvarchar(50)) 

insert into @T 
exec StoredProcedure 
+0

Disculpe ... ¿Dijo temp *** ARCHIVO ***? Si bien técnicamente es una solución factible, no creo que pueda permitirse escribir y eliminar grandes archivos temporales todo el tiempo. – pyon

+0

Tabla temporal, se corrigió en la respuesta, pero solo quería aclarar a los futuros lectores que podrían confundirse porque el comentario anterior está desactualizado. – Remi

3

Si ha realizado el procedimiento que devuelve la lista en una función con valores de tabla, entonces creo que se podría utilizar en una sub-consulta.

6

Insertar los resultados de su proceso almacenado en una tabla variable o tabla temporal hará el truco.

Si intenta volver a utilizar el código en SQL Server de una consulta a la siguiente, tiene más flexibilidad con las funciones de tabla. Las vistas son correctas si no necesita pasar parámetros o usar ningún tipo de lógica de control de flujo. Estos pueden usarse como tablas en cualquier otra función, procedimiento, vista o declaración t-sql.

+0

Estoy de acuerdo Jeff. La función de valor de tabla es excelente para este tipo de cosas. – brian

1

me gustaría utilizar una vista, a no ser que necesita ser parametrizado, en ese caso, usaría una función en línea con valores de tabla si fuera posible, a menos que sea una operación de instrucciones múltiples, donde aún se pueda usar una función con valores de tabla, pero por lo general son menos eficientes.

+0

Necesito tomar parámetros para realizar ambas consultas. Es por eso que estoy usando procedimientos almacenados. – pyon

+0

@Eduardo Leon Yo usaría una función en línea con valores de tabla si es posible. Estos son realmente equivalentes a las vistas parametrizadas en términos de cómo el optimizador puede tratarlas y combinarlas con cualquier vista subyacente y con cualquier código que llame a la ITVF. –

+0

¿Puedes llamar a una ITVF en la cláusula 'FROM' de una consulta? – pyon

Cuestiones relacionadas