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
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)
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
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
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
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.
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.
Estoy de acuerdo Jeff. La función de valor de tabla es excelente para este tipo de cosas. – brian
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.
Necesito tomar parámetros para realizar ambas consultas. Es por eso que estoy usando procedimientos almacenados. – pyon
@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. –
¿Puedes llamar a una ITVF en la cláusula 'FROM' de una consulta? – pyon
- 1. Cómo crear un procedimiento almacenado dentro de otro procedimiento almacenado en SQL Server 2008
- 2. Procedimiento almacenado de depuración en SQL Server 2008
- 3. ¿Cómo guardo un procedimiento almacenado en SQL Server 2008 R2?
- 4. Cómo descifrar el procedimiento almacenado en SQL Server 2008
- 5. SQL Server 2008 procedimiento almacenado con múltiples parámetros de salida
- 6. Usar resultados de procedimiento almacenados anidados en el procedimiento almacenado de llamadas Sql Server 2008
- 7. SQL Server - SELECT FROM procedimiento almacenado
- 8. ¿Es posible ejecutar un procedimiento almacenado en un conjunto sin utilizar un cursor?
- 9. Servidor SQL: ¿es posible recorrer un procedimiento almacenado?
- 10. Cómo restringir NULL como parámetro al procedimiento almacenado SQL Server?
- 11. SQL Server: transacción de procedimiento almacenado
- 12. ¿Es posible recurrir a un procedimiento almacenado recursivamente en SQL Server?
- 13. Cómo utilizar el procedimiento almacenado en SqlCE
- 14. Cambiar el nombre de un procedimiento almacenado en SQL Server
- 15. SQL Server procedimiento almacenado guía para principiantes
- 16. Microsoft SQL Server - ¿Quién creó un Procedimiento almacenado?
- 17. ¿Cómo creo condicionalmente un procedimiento almacenado en SQL Server?
- 18. SQL Server: variable opcional en un procedimiento almacenado
- 19. Quiero ocultar el script de un procedimiento almacenado en SQL Server 2008
- 20. Dónde encontrar el procedimiento almacenado msdb.dbo.sp_send_dbmail en SQL Server
- 21. tiempo de espera cuando llame a un procedimiento almacenado en SQL Server 2008
- 22. Averigüe el procedimiento almacenado de llamada en SQL Server
- 23. No se puede entrar en el procedimiento almacenado en SQL Server 2008
- 24. Añadir una columna y actualizarlo en el mismo procedimiento almacenado en SQL Server 2008
- 25. SQL Server 2000: ¿cómo salir de un procedimiento almacenado?
- 26. Valores de parámetros predeterminados en el procedimiento almacenado de SQL Server 2008
- 27. Valor de retorno en el procedimiento almacenado de SQL Server
- 28. ¿Es posible crear un procedimiento almacenado global en el nivel de servidor Sql
- 29. No es posible Server 2005 depurar procedimientos almacenados SQL en Visual Studio Team System 2008
- 30. Valor devuelto en el procedimiento almacenado de SQL Server
¿Qué sucede cuando su procedimiento almacenado necesita ejecutarse OPENQUERY en un CUBE? No puedes hacer eso desde dentro de una función. –