Aracılığıyla paylaş


Transact-SQL hata bilgisi alınıyor

Hata bilgileri edinmek için iki yol vardır. Transact-SQL:

  • Içinde kapsam bir TRY…CATCH yapýsý CATCH blok aşağıdaki sistem işlevleri kullanabilirsiniz:

    • ERROR_LINE(), hatanın oluştuğu satırın numarası verir.

    • ERROR_MESSAGE(), uygulama için döndürülen iletinin metni verir.Metni gibi uzunlukları, nesne adları veya zamanları, değiştirilebilir parametreleri için sağlanan değerler içerir.

    • ERROR_NUMBER() hata verir.

    • ERROR_PROCEDURE(), saklı yordam veya tetikleyiciyi hatanın oluştuğu adını döndürür.Hata bir saklı yordam veya tetikleyiciyi içinde değil oluşursa, bu işlev NULL döndürüyor.

    • ERROR_SEVERITY() önem verir.

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

  • Hemen tüm yürüttükten sonra Transact-SQL deyim, bir hata için sınama ve @@ ERROR işlevini kullanarak hata numarasını almak.

ERROR_LINE ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY ve ERROR_STATE kullanma

CATCH blok bir TRY…CATCH yapısı kapsamında kullanıldığında ERROR_LINE ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY ve ERROR_STATE işlevleri, yalnızca hata bilgileri döndürür.NULL döndürmeleri bir CATCH blok kapsam dışındadır.Bu işlevler çağırılacak CATCH blok neden hata hakkında bilgi döndürür.Birden çok kez başvurulan olsa bile işlevleri, bir CATCH blok kapsamında çalışan aynı hata bilgilerini herhangi bir döndürür.Işlevleri sağlamak Transact-SQL ifadeler aynı verileri uygulamaya döner.

Iç içe geçmiş CATCH blok içinde ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY ve ERROR_STATE dönüş için CATCH belirli hata bilgilerini engellemek, bunlar başvurulan içinde çalışır.Örneğin, bir dış... TRY'i CATCH yapı CATCH blok iç içe geçmiş bir TRY,... CATCH yapýsý olabilir.Bu işlevler, iç içe geçmiş CATCH blok içinde içteki CATCH blok çağıran bir hata hakkında bilgi döndürür.Dış CATCH blok içinde aynı işlevleri, CATCH blok çağıran bir hata hakkında bilgi döndürür.

Aşağıdaki örnekte, bu dış CATCH blok ERROR_MESSAGE başvuruda bulunulursa, bu dış TRY bloğunun tarafından oluşturulan ileti metni verir göstererek gösterilmektedir.Içteki CATCH blok içinde başvurulan ERROR_MESSAGE iç TRY blok ' oluşturulan metin döndürür.Örnek de bir dış CATCH blok ERROR_MESSAGE her zaman... TRY'i CATCH iç yapı bile gerçekleştirildikten sonra dış TRY blok içinde oluşturulan ileti verdiğini göstermektedir.

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.

Önceki tarafından üretilen hata numarasını yakalanacak @@ ERROR işlev kullanılabilir. Transact-SQL deyim. @@ ERROR, yalnızca hata bilgilerini döndürür hemen sonra Transact-SQL deyim hata üretir.

  • Hata oluşturma deyim bir TRY blok içinde değilse, @@ HATA değeri olmalı sınanmış ve ilişkili CATCH blok içinde ilk deyiminde alınır.

  • Hata oluşturma deyim bir TRY blok içinde değilse, @@ ERROR değeri olmalı sınanmış ve hemen bir hata oluşturmadan sonra deyiminde alınan.

kapsam dışında bir CATCH blok, aşağıdaki hata numarasını @@ ERROR yalnızca kullanılabilir içinde hata ile ilgili bilgilerdir Transact-SQL Kod. Hata, hata iletisi, tanımlanan kullandıysanız sys.Messages tanımlanmış önem ve hata iletisinin metni alabilirsinizsys.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