2008-10-04 25 views
37

Me gustaría ejecutar un procedimiento almacenado dentro de un procedimiento almacenado, p.Ejecutar un procedimiento almacenado dentro de un procedimiento almacenado

EXEC SP1 

BEGIN 

EXEC SP2 
END 

Pero yo sólo quiero SP1 el final después de SP2 ha finalizado la ejecución por lo que necesita para encontrar un camino para SP1 que esperar a que termine antes de SP2SP1 extremos.

SP2 se está ejecutando como parte de SP1 así que tengo algo así como:

CREATE PROCEDURE SP1 
AS 
BEGIN 

EXECUTE SP2 

END 
+0

etiquetas pellizcadas - "servidor" causó algunos falsos positivos – finnw

+0

Hola, reetiquetado. Estamos racionalizando las etiquetas mssql y sqlserver. – ConcernedOfTunbridgeWells

+2

Parece que esta pregunta es un [duplicado] (http://stackoverflow.com/questions/170440/stored-procedure-not-being-executed-within-another-stored-procedure). Por favor, solo haga su pregunta una vez. – Rick

Respuesta

3

Así es como funciona ejecutar procedimientos almacenados en orden, no es necesario comenzar simplemente algo así como

exec dbo.sp1 
exec dbo.sp2 
+1

También podría envolverlo en una transacción también, asegúrese de que todo se ejecute correctamente. – mattruma

11

Aquí hay un ejemplo de uno de nuestros procedimientos almacenados que ejecuta múltiples procedimientos almacenados dentro de él:

ALTER PROCEDURE [dbo].[AssetLibrary_AssetDelete] 
(
    @AssetID AS uniqueidentifier 
) 
AS 

SET NOCOUNT ON 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

EXEC AssetLibrary_AssetDeleteAttributes @AssetID 
EXEC AssetLibrary_AssetDeleteComponents @AssetID 
EXEC AssetLibrary_AssetDeleteAgreements @AssetID 
EXEC AssetLibrary_AssetDeleteMaintenance @AssetID 

DELETE FROM 
    AssetLibrary_Asset 
WHERE 
    AssetLibrary_Asset.AssetID = @AssetID 

RETURN (@@ERROR) 
32

T-SQL no es asíncrono, por lo que realmente no tiene más remedio que esperar hasta que finalice SP2. Afortunadamente, eso es lo que quieres.

CREATE PROCEDURE SP1 AS 
    EXEC SP2 
    PRINT 'Done' 
1

Hola He encontrado que mi problema es que SP2 no se ejecuta desde SP1 cuando se ejecuta SP1.

A continuación se muestra la estructura de SP1:

ALTER PROCEDURE SP1 
AS 
BEGIN 

Declare c1 cursor.... 

open c1 
fetch next from c1 ... 

while @@fetch_status = 0 
Begin 

... 

Fetch Next from c1 
end 

close c1 

deallocate c1 

exec sp2 

end 
+2

La próxima vez solo publique el código completo ... nos ahorrará mucho tiempo y esfuerzo. – mattruma

1

Su SP2 es probable que no funcionando debido a algún fallo en el código al principio de SP1 por lo que no se alcanza EXEC SP2.

Por favor, publique todo el código.

9

Procedimiento almacenado en línea que usamos según nuestra necesidad. Ejemplo como diferentes idéntica de los parámetros con valores diferentes que tenemos que utilizar en las consultas ..

Create Proc SP1 
(
@ID int, 
@Name varchar(40) 
-- etc parameter list, If you don't have any parameter then no need to pass. 
) 

    AS 
    BEGIN 

    -- Here we have some opereations 

-- If there is any Error Before Executing SP2 then SP will stop executing. 

    Exec SP2 @ID,@Name,@SomeID OUTPUT 

-- ,etc some other parameter also we can use OutPut parameters like 

-- @SomeID is useful for some other operations for condition checking insertion etc. 

-- If you have any Error in you SP2 then also it will stop executing. 

-- If you want to do any other operation after executing SP2 that we can do here. 

END 
Cuestiones relacionadas