Aracılığıyla paylaş


Transact-SQL hata bilgilerini alma

Hata bilgileri elde etmek için iki yol vardır Transact-SQL:

  • catch kapsam içinde blok , bir try…catch yapısı aşağıdaki sistem işlevleri kullanabilirsiniz:

    • ERROR_LINE() hatanın oluştuğu satırın numarasını döndürür.

    • error_message() uygulama için döndürülen iletinin metni verir.Metin sağlanan uzunlukları, nesne adlarını veya süreleri gibi değiştirilebilir parametreler için değerler içerir.

    • error_number() hata sayısını verir.

    • error_procedure() saklı yordam veya tetikleyiciyi hata oluştuğu adını döndürür.Hata bir saklı yordam veya tetikleyiciyi içinde yapılmazsa bu işlev null döndürür.

    • ERROR_SEVERITY() önem verir.

    • error_state() durumu döndürür.

  • Herhangi yürütme hemen sonra Transact-SQL deyim, bir hata için test ve almak hata numarasını kullanarak @@ error işlev.

ERROR_LINE, error_message, error_number, error_procedure, ERROR_SEVERITY ve error_state kullanma

catch kapsam içinde kullanıldığında, ERROR_LINE, error_message, error_number, error_procedure, ERROR_SEVERITY ve error_state işlevler yalnızca hata bilgileri iade blok nin bir try…catch yapı.Bir catch kapsam dışında kalan blok bunlar null döndürür.Bu işlevler catch nedeniyle oluşan hata hakkında bilgi dönmek blok çağrılacak.İşlevler bir catch kapsam içinde çalıştırmak bunlar aynı hata bilgilerini herhangi bir yere dönmek blok, birden çok kez başvurulan bile.İşlevleri sağlamak Transact-SQL ifadeleri uygulama döndürülen verileri

catch iç içe geçmiş bloks, ERROR_LINE, error_message, error_number, error_procedure, ERROR_SEVERITY ve error_state işlevler dönüş hata bilgileri özel için catch blok hangi başvurulduklarında içinde.Örneğin, catch blok , dış bir try...Yuvalanmış try catch yapı olabilir...catch yapı.İçinde yuvalanmış catch blok, bu işlevleri çağıran içteki catch hata hakkında bilgi dönmek blok.Aynı fonksiyonlarında dış catch blok çağrılan bu catch hata hakkında bilgi döndürür blok.

Aşağıdaki örnekte bu dış catch error_message başvurulduğunda, göstererek TreeView'i örnekler blok, outer try tarafından oluşturulan ileti metni verir blok.İçteki catch başvurulduğunda, blok, error_message INNER try oluşturulan metin verir blok.Örnekte ayrıca, dış catch gösterilmiştir blok error_message outer try oluşturulan ileti her zaman verir blok, iç deneyin sonra da...catch yapı çalıştırın.

IF EXISTS (SELECT message_id FROM sys.messages
    WHERE message_id = 50010)
        EXECUTE sp_dropmessage 50010;
GO
EXECUTE sp_addmessage @msgnum = 50010,
    @severity = 16, 
    @msgtext = N'Message text is from the %s TRY block.';
GO
BEGIN TRY -- Outer TRY block.
    -- Raise an error in the outer TRY block.
    RAISERROR (50010, -- Message id.
        16, -- Severity,
        1, -- State,
        N'outer'); -- Indicate TRY block.
END TRY -- Outer TRY block.
BEGIN CATCH -- Outer CATCH block.
    -- Print the error message recieved for this
    -- CATCH block.
    PRINT N'OUTER CATCH1: ' + ERROR_MESSAGE();
    BEGIN TRY -- Inner TRY block.
        -- Start a nested TRY...CATCH and generate
        -- a new error.
        RAISERROR (50010, -- Message id.
            16, -- Severity,
            2, -- State,
            N'inner'); -- Indicate TRY block.
    END TRY -- Inner TRY block.
    BEGIN CATCH -- Inner CATCH block.
        -- Print the error message recieved for this
        -- CATCH block.
        PRINT N'INNER CATCH: ' + ERROR_MESSAGE();
    END CATCH; -- Inner CATCH block.
    -- Show that ERROR_MESSAGE in the outer CATCH
    -- block still returns the message from the
    -- error generated in the outer TRY block.
    PRINT N'OUTER CATCH2: ' + ERROR_MESSAGE();
END CATCH; -- Outer CATCH block.
GO

@@ error kullanarak bilgileri alınıyor

@@ error işlev önceki tarafından üretilen hata sayısını yakalamak için kullanılan Transact-SQL deyim.@@ error yalnızca hata bilgilerini döndürür hemen sonra Transact-SQL deyim, oluşturan hatası.

  • Hata üretme deyim try bir ise blok, @@ hata değeri test ve gerekir ilişkili catch, ilk ifadesinde alınan blok.

  • Hata üretme deyim try bir değil, blok, @@ hata değeri test ve gerekir sonra hemen bir hata üretme deyim içinde alınır.

Bir catch kapsam dışında kalan blok, hata @@ error yalnızca ilgili bilgileri içinde hata sayısıdır Transact-SQL kod.Hata tanımlanan bir hata iletisi kullanılıyorsa sys.messages, tanımlı önem ve hata iletisi metni alabilirsiniz sys.messages Bu örnekte gösterildiği gibi.

IF EXISTS (SELECT message_id FROM sys.messages
    WHERE message_id = 50010)
        EXECUTE sp_dropmessage 50010;
GO
-- Define a message with text that accepts
-- a substitution string.
EXECUTE sp_addmessage @msgnum = 50010,
    @severity = 16, 
    @msgtext = N'Substitution string = %s.';
GO
DECLARE @ErrorVariable INT;
-- RAISERROR uses a different severity and
-- supplies a substitution argument.
RAISERROR (50010, -- Message id.
    15, -- Severity,
    1, -- State,
    N'ABC'); -- Substitution Value.
-- Save @@ERROR.
SET @ErrorVariable = @@ERROR;
-- The results of this select illustrate that
-- outside a CATCH block only the original
-- information from sys.messages is available to
-- Transact-SQL statements. The actual message
-- string returned to the application is not
-- available to Transact-SQL statements outside
-- of a CATCH block.
SELECT @ErrorVariable AS ErrorID,
    text
FROM sys.messages
WHERE message_id = @ErrorVariable;
GO