Aracılığıyla paylaş


@@ ERROR kullanma

@@ ERROR sistem işlev 0 verir son Transact-SQL deyimi başarıyla yürütüldü; deyim bir hata oluşturursa, @@ ERROR hata verir. @@ ERROR değerinin her tamamlanma değiştirir. Transact-SQL deyim.

@@ ERROR yeni alır, çünkü, değer her Transact-SQL deyim tamamlandığında, iki yoldan biriyle @@ ERROR işlem:

  • @@ ERROR kullanın ya da sınama hemen sonra Transact-SQL deyim.

  • Bir tamsayı @@ ERROR kaydetmek hemen sonra değişken Transact-SQL deyim tamamlar. Değişken değerinin, daha sonra kullanılabilir.

Hata oluşturma deyim bir TRY…CATCH yapýsý TRY bloğunun değilse, @@ ERROR olmalı test veya hatayý oluþturan hemen deyiminden sonraki deyime deyim kullanılır.Veya hata oluşturma deyim bir TRY blok içinde değilse, @@ ERROR test ya da kullanılabilen ilk deyimde bulunan ilgili CATCH blok.Içinde kapsam @@ ERROR tarafından bildirilen aynı hata numarasını almak için bir CATCH blok ERROR_NUMBER işlev kullanılabilir.ERROR_NUMBER @@ ERROR CATCH blok içinde ilk deyim tarafından sıfırlanana ise, tüm ifadeleri CATCH blok, kapsamdaki kullanılabilir olduğunu avantajı vardır.

Koşullu deyimleri (örneğin, EĞER deyim, @@ ERROR sıfırlandı.@@ ERROR, IF deyimini, ıf @@ ERROR başvuru, başvuru veya YOKSA, blokları @@ HATA bilgilerini alır.Aşağıdaki örnekte, @@ ERROR IF tarafından sıfırlanır ve YAZDıRMAYA dahil başvurulan hata numarasını döndürmüyor deyim.

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

Aşağıdaki örnek, beklenen sonuçlar döndürür.

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

@@ ERROR hem de @@ ROWCOUNT bir deyim çalıştırıldıktan sonra başvurmak isterseniz, bunlar aynı ifadesinde başvurulan gerekir.@@ ERROR hem de @@ ROWCOUNT her sıfırlanır Transact-SQL deyim; bu nedenle, her ikisi de aynı deyiminde bir sınanmakta olan hemen sonra başvurulan gerekir. Ilk YAZDıRMA tarafından sıfırlandıktan sonra bu kadar başvurulmuyor aşağıdaki örnekte, @@ ROWCOUNT her zaman 0 olacaktır; bunun nedeni deyim.

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

Aşağıdaki örnek, beklenen sonuçlar döndürür.

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

@@ ERROR yalnızca hataların, uyarıların değil;'için geçirilen toplu işlemleri, saklı yordamları ve Tetikleyicileri @@ ERROR ortaya çıkan uyarı algılamak için kullanamazsınız.

@@ ERROR yaygın BIR kullanımı SQL Server 2000 ve daha önce başarılı veya başarısız bir saklı yordam gösterir. Bir tamsayı değişken 0 olarak başlatıldı.Sonra her Transact-SQL deyim tamamlandığında, @@ ERROR 0 olan için sınanmış ve 0, BT değil ise, değişken olarak depolanır. Yordamı, daha sonra üzerinde RETURN deyim değişken döndürür.Hiçbiri Transact-SQL deyimleri yordamı bir hata oluştu, değişkeni 0 olarak kalır. Bir ya da daha çok ifadeyi bir hata oluşturursa, değişken son hata numarasını içerir.Aşağıdaki örnek, basit saklı yordam bu mantığı ile gösterilir.

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

@@ ERROR karşılık.... catch DENEYİN.

@@ ERROR kullanarak hataları algılama, bir birincil yol çok farklı bir stile TRY…CATCH ile kullanılan hata işleme kodu, müşteri adayı oluşturur.

  • @@ ERROR olmalı ya da test veya sonra kaydedilen her Transact-SQL deyim, bir uygulama geliştiricisi tahmin edemiyor çünkü ilerlemek hangi deyim, bir hata oluşturabilir. Bu sayısı iki katına çıkar Transact-SQL deyimleri mantığı, belirli bir parça uygulamak için kodlanmış gerekir.

  • TRY…CATCH çok daha basit yapılarıdır.blok Transact-SQL ifadeler tarafından BEGIN TRY ve END TRY ifadeleri ilişkisindeki ve sonra bir CATCH blok oluşturulan hataları işlemek için bu ifadeleri blok tarafından yazılır.

Bir CATCH bloğunun dışından @@ ERROR yalnızca bir parçası olan bir Database Engine hata, toplu iş iş iş, saklı yordam veya hatayý oluþturan bir tetikleyici içinde kullanılabilir. Hatanın önem derecesi, durum ve değiştirme dizeleri (örneğin, nesne adları) içeren bir ileti metni gibi tüm diğer bölümleri, yalnızca, bunlar API hata işleme mekanizmaları kullanarak işlenebilecek uygulama döndürülür.Hata bir CATCH blok ERROR_LINE ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_NUMBER, ERROR_SEVERITY ve ERROR_STATE kullanılabilir sistem işlevleri çağıran.