Udostępnij za pośrednictwem


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.