@@ error kullanma
@@ error sistem işlev 0 döndürür son Transact-SQL deyim yürütüldü başarıyla; Deyim bir hata oluşturursa, @@ error hata numarasını döndürür.Her birinin tamamlanma @@ error değerini değiştirir Transact-SQL deyim.
@@ error yeni aldığı için ne zaman değer her Transact-SQL deyim tamamlar, iki yoldan biriyle @@ error işlem:
Test veya @@ error kullanmak hemen sonra Transact-SQL deyim.
@@ error kaydetmek bir tamsayı değişken hemen sonra Transact-SQL deyim tamamlar.Değişkenin değeri daha sonra kullanılabilir.
Hata üretme deyim try değil, blok , bir try…catch yapı, @@ error test veya hatayı oluşturan deyiminden hemen kullanılan gerekir.Hata üretme deyim try bir ise blok, @@ error test veya ilişkili catch ilk deyiminde kullanılan blok.Bir catch kapsam içinde blok, @@ error tarafından bildirilen aynı hata numarasını almak için error_number işlev kullanılabilir.error_number tüm tablolarda kullanılabilir olduğu avantajı olan kapsam catch, @@ error ilk deyim, catch bloğu tarafından sıfırlanır oysa engelleyebilir.
Koşullu deyimEğer gibi s deyim, @@ error sıfırlayın.@@ error IF başvurursanız deyim, IF @@ error başvuran veya bildirimin engeller olacak @@ error bilgileri alır.Aşağıdaki örnekte, @@ error olarak sıfırlanır ve BASKIDA başvurulduğunda hata numarasını döndürür 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 verir.
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
Bir deyim çalıştırıldıktan sonra @@ error hem @@ rowcount başvurmak istiyorsanız, aynı deyim içinde başvurulmalıdır.@@ error hem @@ rowcount sıfırlanır her Transact-SQL deyim; Bu nedenle, her ikisi de bir test edilen hemen sonra aynı deyim içinde başvurulmalıdır.İlk Baskı tarafından sıfırlandıktan sonra kadar başvuru değil çünkü aşağıdaki örnekte @@ rowcount her zaman 0 olacaktır deyim.
USE AdventureWorks2008R2;
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 verir.
USE AdventureWorks2008R2;
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, hatalar, uyarılar için değil yalnızca için oluşturulur; toplu işlemleri, saklı yordamları ve Tetikleyicileri @@ error oluşmuş tüm uyarılar 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 göstermek için bir saklı yordam.Bir tamsayı değişkeni 0 olarak başlatılır.Sonra her Transact-SQL deyim tamamlar, @@ error için 0, yapılan test ve varsa onu değil 0, BT depolanır değişken.Yordam değişken return deyim üzerinde daha sonra döndürür.Hiçbiri Transact-SQL ifadeleri yordamı içinde bir hata vardı, değişkeni 0 kalır.Bir veya birden çok deyimleri hata oluşturursa, son hata numarası değişken tutar.Bu mantık ile basit bir saklı yordam aşağıdaki örnekte gösterilmektedir.
USE AdventureWorks2008R2;
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, JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @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 vs.DENEYİN...CATCH
@@ error kullanarak hataları algılama birincil aracı çok farklı bir stil ile try… kullanılan hata işleme kodunu, müşteri adaylarıcatch yapıları.
@@ error ya da test veya gerekir sonra kaydedilen her Transact-SQL deyim bir geliştirici önceden tahmin edilemez çünkü içinde ilerlemek hangi deyim üretmek bir hata.Bu sayısı iki katına çıkar Transact-SQL ifadeleri, gerekir kodlanmış mantığı, belirli bir parça uygulamak için
TRY…catch yapıları çok daha basittir.Bloğunu Transact-SQL ifadeleri deneyin başlar ve end TRY'deyimleri tarafından Sınırlanan ve ardından bir catch bloğu yazılmış işlemek hatalar, tarafından üretilen bu blok deyimleri.
Bir catch dışında blok, @@ error parçasıdır tek bir Veritabanı Altyapısı hata kullanılabilir toplu iş, saklı yordam veya tetikleyici oluşturulan hata.Tüm diğer parçalar, önem, durumu ve değiştirme dizelerini (örneğin nesne adları) içeren bir ileti metni gibi bir hatanın içinde bunlar API hata işleme mekanizmaları kullanarak işlenebilir uygulama için döndürülür.Bir catch hata çağırır, blok, ERROR_LINE, error_message, error_procedure, error_number, ERROR_SEVERITY ve error_state kullanılabilir sistem işlevleri.
Ayrıca bkz.