2009-12-09 8 views
2

Я хочу вызвать SP из другого SP. Я знаю, что я могу легко назвать это. Но проблема в том, что если в SP2 возникает ошибка, я хочу ROLLBACK SP1.Вызов хранимой процедуры из другой хранимой процедуры

SP1
НАЧАТЬ Tran
[Некоторые Code]
Зов SP2
[некоторый код]

SP2
НАЧАТЬ TRAN
[Некоторые Code]
[Comes Error]
ROLLBACK TRAN

Это будет откат Tran только в sp2. Я хочу также использовать RollBack SP1, если в sp2 произошла ошибка.

Любая помощь будет оценена по достоинству.

+2

@vaibhav: Я обновил тег 'sqlserver2005' до' sql-server-2005'. Не могли бы вы использовать существующие теги? Благодарю. – Sung

+0

За все, что вы хотели знать об обработке ошибок, но боялись спросить, Эрланд Соммарског имеет отличную (хотя и незавершенную) статью на нем здесь: http://sommarskog.se/error_handling_2005.html ... он также ссылается на его двух статьи для SQL Server 2000, но некоторые из них все еще применяются в более поздних версиях. –

ответ

2

Кажется люди имеют проблемы с другими информационными сайтами ...

Суть ее в том, что родительская процедура через исключение при попытке выполнить ROLLBACK в качестве у ребенка уже есть. Путь вокруг этого состоит в том, чтобы родительский контроль перед @ commit перед передачей.

http://forums.asp.net/t/1259708.aspx

Create procedure [dbo].[parent] as Begin Transaction Begin Try 
    Exec Child End Try Begin Catch 
    If @@Trancount > 0 
     RollBack End Catch Commit 


Create procedure [dbo].[Child] as Begin Transaction Begin Try 
    --Do inserts here End Try Begin Catch 
    If @@Trancount > 0 
     RollBack 
    RAISERROR('Error Occured',16,1) End Catch Commit 
+1

Здесь вы не сможете ссылаться на этот сайт.;-) – Tomalak

+0

ничего не видит по вашей ссылке. –

+0

Спасибо, могу ли я использовать ошибку @@ для проверки «поднятой ошибки» –

1

Одной из возможностей является создание SP2 с параметром @ErrorCode INT OUTPUT, который указывает, должен ли вызывающий абонент откатываться или совершать транзакции.

+0

Или используйте возвращаемые значения. – erikkallen

4

Попробуйте RAISERROR в SP2.

+0

Не могли бы вы рассказать об этом. –

+0

Повышение ошибки в SP2 должно привести к тому, что SP1 откатится и от транзакции. Вы делаете ручную откатную или автоматическую? – Tomalak

+0

Автоматический, используя «Rollback Tran» –

0

Создайте выходной параметр в своем втором SP, который имеет бит типа, указывая, что произошла ошибка или нет. Исходя из этого, вы можете откатить SP 1.

1

вы можете использовать код ошибки, как, что (им не писать код просто, как мне делать, если я вам)

SP1 
DECLARE ReturnVal 
BEGIN TRAN 
CODE 
CALL SP1 ReturnVal output 
IF ReturnVal=errorvalue 
ROLLBACK TRAN 

SP2 
DECLARE ReturnVal output 
BEGIN TRAN 
CODE 
ERROR 
SET ReturnVal=errorVal 
ROLLBACK 
RETURN ReturnVal 
1

Это не звучит, как вы нужны вложенные транзакции. Попробуйте контролировать совершение/откат с TRY блоками (psuedocode):

begin try 
    begin trans 
    do stuff 
    call other sp 
    do more stuff 
    commit trans 
end try 
begin catch 
    rollback trans 
    do something here to report failure to app 
end catch 

В случае возникновения ошибки в любом месте в пределах блока попробовать, в том числе жгутов другого зра, то управление переходит к блоку улова и откатить транзакцию.

+0

Я думаю, что это стоит рассмотреть. Но не должен использовать выходной параметр, как говорят другие. –

+0

@valbhav: Подумайте, как использовать «RAISERROR» и «TRY ... CATCH» ... – Sung

+0

Моя схема будет ловить ошибки «подняты» либо вами, либо сервером. Если вам нужно сообщить некоторую информацию о бизнес-ошибке из второго sp, вы можете вызвать raiserror, как предложили другие, что поймает моя попытка try-catch. Или вы можете использовать выходной параметр для сообщения об ошибке. В этом случае попытка try-catch не поможет вам, и вам нужно будет сделать оператор «if» или что-то испытать возвращаемое значение. Тем не менее, trh try-catch по-прежнему приятно поймать неожиданные ошибки. – Ray

Смежные вопросы