2011-10-27 12 views
5

mam dziedziczone kod, który wygląda tak:Wydajność TSQL z @@ Błąd i czy można je wymienić?

procedury zapisane UpdateSomeStuff

Update Table1 Set [email protected] 

IF @@Error > 0 Goto ERR 

Update Table2 Set [email protected] 

IF @@Error > 0 Goto ERR 

RETURN 0 

ERR: 

return -1; 

Ta sp nazywany jest przez ADO.NET w C# jak ten

try 
{ 
    myCommand.ExecuteNonQuery(); 
} 
catch (System.Exception ex) 
{ 
    _log.Error(ex); 
    throw(); 
} 
finally 
{ 
    if(myConnection!=null) 
    { 
      myConnection.Close(); 
    } 
} 

Ja tylko pytam myself: Czy część JEŻELI @@ Błąd> 0 Czy można uzyskać cokolwiek z ERR? Jeśli wystąpi błąd, sp i tak wróci, a wyjątek zostanie przechwycony w metodzie wywołania.

Kod wywołujący nie obsługuje wartości zwracanej 0 i -1. Mój plan polegał na usunięciu wszystkich operacji obsługi błędów w procedurze przechowywanej i uzyskania tego samego wyniku. Mam rację, czy jest coś, co przeoczyłem?

+0

Nie, jeśli wystąpi błąd, pozostałe instrukcje SP będą nadal wykonywane. Jeśli intencją jest NIE kontynuowanie wykonywania pozostałego T-SQL, musisz zachować kontrole błędów na miejscu. Ale jestem zaskoczony, że nie ma żadnych transakcji związanych z oryginalnym SP. – HardCode

Odpowiedz

1

Moi '2 centy' można zabić wydajność poprzez usunięcie jeśli @ błąd sprawozdania. , więc albo zaimplementuj próbę catch, jak mówi Mitch, albo nie usuwaj ich. Pomyśl tylko, czy wystąpił błąd na pierwszym wyciągu, to nie spróbujesz wykonać drugiej instrukcji i tak dalej, jeśli masz instrukcje @ błędu.

a jeśli je usuniesz, serwer sql wypróbuje następną instrukcję, aż osiągnie limit, gdy zdecyduje, że nie może kontynuować dalszego przetwarzania.

7

Lepszym rozwiązaniem (SQL Server 2005 i później) jest użycie TRY..CATCH:

BEGIN TRY 
    -- Perform operations here 
END TRY 
BEGIN CATCH 
    SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

Dobrym odniesienia jest: Error Handling in SQL 2005 and Later

+0

Czy nadal będzie to blok catch metody wywołującej? Ponieważ tego właśnie potrzebuję. –

+1

Jeśli zgłosisz błąd, jeśli procedura składowana, może zostać przechwycony przez blok catch catch kodu C#. –

Powiązane problemy