2008-10-04 63 views
37

Tôi muốn thực hiện một thủ tục được lưu trữ trong một thủ tục được lưu trữ, ví dụ:Thực hiện một thủ tục được lưu trữ trong một thủ tục lưu sẵn

EXEC SP1 

BEGIN 

EXEC SP2 
END 

Nhưng tôi chỉ muốn SP1 để kết thúc sau SP2 đã chạy xong vì vậy tôi cần phải tìm một cách để SP1 chờ SP2 để kết thúc trước khi SP1 kết thúc.

SP2 đang được thực hiện như một phần của SP1 vì vậy tôi có một cái gì đó như:

CREATE PROCEDURE SP1 
AS 
BEGIN 

EXECUTE SP2 

END 
+0

thẻ chỉnh - "máy chủ" gây ra một số dương tính giả – finnw

+0

Hi, retagged. Chúng tôi đang hợp lý hoá các thẻ mssql và sqlserver. – ConcernedOfTunbridgeWells

+2

Có vẻ như câu hỏi này là [trùng lặp] (http://stackoverflow.com/questions/170440/stored-procedure-not-being-executed-within-another-stored-procedure). Vui lòng chỉ hỏi câu hỏi của bạn một lần. – Rick

Trả lời

3

Thats như thế nào nó hoạt động lưu trữ các thủ tục chạy theo thứ tự, bạn không cần phải bắt đầu chỉ một cái gì đó giống như

exec dbo.sp1 
exec dbo.sp2 
+1

Bạn cũng có thể quấn nó trong một giao dịch chỉ quá chắc chắn rằng tất cả các thực hiện một cách chính xác. – mattruma

11

Dưới đây là ví dụ về một trong các thủ tục được lưu trữ của chúng tôi thực hiện nhiều thủ tục được lưu trữ trong đó:

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 không đồng bộ, vì vậy bạn thực sự không có lựa chọn nào khác ngoài việc đợi cho đến khi SP2 kết thúc. May mắn thay, đó là những gì bạn muốn.

CREATE PROCEDURE SP1 AS 
    EXEC SP2 
    PRINT 'Done' 
1

Xin chào Tôi đã tìm thấy sự cố của tôi là SP2 không thực thi từ bên trong SP1 khi SP1 được thực thi.

Dưới đây là cấu trúc của 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

Lần sau chỉ cần đăng toàn bộ mã ... nó sẽ tiết kiệm cho chúng ta rất nhiều thời gian và công sức. – mattruma

1

SP2 của bạn có lẽ không chạy vì một số thất bại trong các mã đầu trong SP1 nên EXEC SP2 không đạt được.

Vui lòng đăng toàn bộ mã của bạn.

9

Thủ tục được lưu trữ nội tuyến mà chúng tôi sử dụng theo nhu cầu của chúng tôi. Ví dụ như tham số tương tự khác nhau với giá trị khác nhau, chúng ta phải sử dụng trong các truy vấn ..

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 
Các vấn đề liên quan