Za pomocą błąd @@
funkcja systemu @@ błędu zwraca 0 Jeśli ostatnia Transact-SQL instrukcja wykonana pomyślnie, jeśli instrukcja wygenerowany błąd, @@ błąd zwraca numer błędu. Zmiana wartości @@ błąd po ukończeniu Transact-SQL Instrukcja.
Ponieważ @@ błąd pobiera nową wartość, gdy każdy Transact-SQL instrukcja zakończeniu procesu @@ błąd w jednym z dwóch sposobów:
Testowanie lub użyj @@ błąd natychmiast po Transact-SQL Instrukcja.
Zapisywanie @@ błąd w liczbę całkowitą z zakresu zmiennej natychmiast po Transact-SQL wykonuje instrukcję. Później można użyć wartości zmiennej.
Instrukcja generuje błąd, nie znajduje się w blok TRY konstrukcji TRY…CATCH, błąd @@ muszą być badane lub używane w instrukcji znajdującej się bezpośrednio po instrukcji, który wygenerował błąd.Jeśli instrukcja generuje błąd znajduje się w blok TRY, @@ błąd może być badane lub używane w pierwszej instrukcji w skojarzonym blok CATCH.W ramach zakres blok CATCH, funkcja ERROR_NUMBER może być używana do pobierania tego samego numeru błędu zgłoszony przez @@ błąd.ERROR_NUMBER ma tę zaletę, że jest on dostępny dla wszystkich instrukcja w zakresie blok CATCH konieczne @@ błąd zostanie zresetowane przez pierwszą instrukcją w blok CATCH.
instrukcja warunkowych, takich jak wyrażenia IF zresetować @@ błąd.Jeśli odwołanie @@ błąd w instrukcja IF, odwołania do @@ błąd w IF, CZYLI blokuje nie wybierze informacjach @@ błędu.W poniższym przykładzie @@ błąd zostanie zresetowane przez IF i nie zwraca numer błędu, jeśli w instrukcja PRINT.
DECLARE @ErrorVar INT
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
-- This PRINT statement prints 'Error = 0' because
-- @@ERROR is reset in the IF statement above.
PRINT N'Error = ' + CAST(@@ERROR AS NVARCHAR(8));
GO
W poniższym przykładzie są zwracane oczekiwanych wyniki.
DECLARE @ErrorVar INT
RAISERROR(N'Message', 16, 1);
-- Save the error number before @@ERROR is reset by
-- the IF statement.
SET @ErrorVar = @@ERROR
IF @ErrorVar <> 0
-- This PRINT statement correctly prints 'Error = 50000'.
PRINT N'Error = ' + CAST(@ErrorVar AS NVARCHAR(8));
GO
Jeżeli chcesz odwołać zarówno @@ błąd i ROWCOUNT @@ po instrukcja jest uruchomione, ich musi odwoływać się w tym samym instrukcja.Zresetowanie z każdym @@ błąd i ROWCOUNT @@ Transact-SQL Instrukcja; Dlatego obie musi odwoływać się w tej samej instrukcji, bezpośrednio po jeden testowanego. W poniższym przykładzie @@ ROWCOUNT będzie zawsze równa 0, ponieważ nie są wywoływane do czasu, po został zresetowany przez pierwszy WYDRUK instrukcja.
USE AdventureWorks;
GO
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
-- This PRINT would successfully capture any error number.
PRINT N'Error = ' + CAST(@@ERROR AS NVARCHAR(8));
-- This PRINT will always print 'Rows Deleted = 0 because
-- the previous PRINT statement set @@ROWCOUNT to 0.
PRINT N'Rows Deleted = ' + CAST(@@ROWCOUNT AS NVARCHAR(8));
GO
W poniższym przykładzie są zwracane oczekiwanych wyniki.
USE AdventureWorks;
GO
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
-- Save @@ERROR and @@ROWCOUNT while they are both
-- still valid.
SELECT @ErrorVar = @@ERROR,
@RowCountVar = @@ROWCOUNT;
IF (@ErrorVar <> 0)
PRINT N'Error = ' + CAST(@ErrorVar AS NVARCHAR(8));
PRINT N'Rows Deleted = ' + CAST(@RowCountVar AS NVARCHAR(8));
GO
@@ Błąd jest wywoływane tylko w przypadku błędów, a nie dla ostrzeżenia; partii, procedur przechowywanych i wyzwalaczy, nie można używać @@ błąd wykryć ostrzeżenia, które wystąpiły.
Powszechnym zastosowaniem @@ błąd w SQL Server 2000 i wcześniej wskazują powodzenie lub niepowodzenie procedura przechowywana. Zmienna liczba całkowita jest ustawiana na 0.Po każdym Transact-SQL wykonuje instrukcję, błąd @@ jest testowany pod kątem jest 0, a jeśli nie jest 0, są przechowywane w zmiennej. Procedura zwraca następnie zmiennej instrukcja RETURN.Jeśli żadna z Transact-SQL instrukcje w procedurze wystąpił błąd, zmienna pozostaje na 0. Jeżeli jeden lub więcej instrukcji wygenerowany błąd, zmienna zawiera ostatni numer błędu.W poniższym przykładzie pokazano proste procedura przechowywana o tej reguły.
USE AdventureWorks;
GO
IF EXISTS(SELECT name FROM sys.objects
WHERE name = N'SampleProcedure')
DROP PROCEDURE SampleProcedure;
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxVacation INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave1 INT, @ErrorSave2 INT;
SET @ErrorSave1 = 0;
-- Do a SELECT using the input parameter.
SELECT LoginID, NationalIDNumber, Title
FROM HumanResources.Employee
WHERE EmployeeID = @EmployeeIDParm;
-- Save @@ERROR value in first local variable.
SET @ErrorSave1 = @@ERROR;
-- Set a value in the output parameter.
SELECT @MaxVacation = MAX(VacationHours)
FROM HumanResources.Employee;
-- Save @@ERROR value in second local variable.
SET @ErrorSave2 = @@ERROR;
-- If second test variable contains non-zero value,
-- overwrite value in first local variable.
IF (@ErrorSave2 <> 0) SET @ErrorSave1 = @ErrorSave2;
-- Returns 0 if neither SELECT statement had
-- an error; otherwise, returns the last error.
RETURN @ErrorSave1;
GO
DECLARE @OutputParm INT;
DECLARE @ReturnCode INT;
EXEC @ReturnCode = SampleProcedure 13, @OutputParm OUTPUT;
PRINT N'OutputParm = ' + CAST(@OutputParm AS NVARCHAR(20));
PRINT N'ReturnCode = ' + CAST(@ReturnCode AS NVARCHAR(20));
GO
W stosunku do błąd @@SPRÓBUJ... CATCH
Za pomocą @@ błąd jako podstawowy sposób wykrywanie błędów prowadzi do bardzo inny styl niż kod obsługi błędów, które jest używane w przypadku TRY…CATCH konstruuje.
@@ Błąd muszą być albo badane lub zapisane po każdym Transact-SQL Instrukcja ponieważ projektant nie można przewidzieć w wcześniejsze instrukcji, które może wygenerować błąd. To podwaja liczbę Transact-SQL instrukcje, które muszą być kodowane do wykonania danego fragmentu logikę.
Konstrukcje TRY…CATCH jest znacznie prostsze.Blok Transact-SQL instrukcje jest ograniczone przez instrukcji BEGIN TRY i END TRY, a następnie jednego bloku CATCH napisano w celu obsługi błędów, które mogą być generowane przez ten blok instrukcji.
Z zewnątrz blok CATCH @@ błąd jest tylko część Database Engine Błąd jest dostępna w ramach partia, procedura przechowywana lub wyzwalacz, który wygenerował błąd. Tylko do aplikacji, w którym te mogą być przetwarzane za pomocą mechanizmów obsługi błędów API zwracane są wszystkie pozostałe części błędu, na przykład jej ważności, stan i tekst komunikatu zawierającego ciągi zastępcze (na przykład nazwy obiektu).Jeśli błąd wywołuje blok CATCH, ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE ERROR_NUMBER, ERROR_SEVERITY i ERROR_STATE mogą być używane funkcje systemowe.
See Also