Udostępnij za pośrednictwem


RAISERROR (języka Transact-SQL)

Generuje komunikat o błędzie i inicjuje wystąpił błąd podczas przetwarzania w sesja.RAISERROR można albo odwołanie do wiadomości użytkownika przechowywane w sys.messages katalogu widoku lub tworzenia wiadomości dynamicznie.Wiadomość jest zwracana jako komunikat o błędzie programu serwera do aplikacji wywołującej lub skojarzone blok CATCH konstrukcja TRY…CATCH.

Topic link iconKonwencje składni języka Transact-SQL

RAISERROR ( { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

Argumenty

  • msg_id
    numer komunikatu do zdefiniowanej przez użytkownika błędów są przechowywane w sys.messages Widok katalogu używaniesp_addmessage.Błąd liczby komunikatów o błędach zdefiniowane przez użytkownika powinna być większa niż 50 000.Kiedy msg_id nie jest określony, RAISERROR wywołuje komunikat o błędzie z błędy o numerach 50 000.

  • msg_str
    Jest podobna do komunikat zdefiniowanej przez użytkownika z formatowaniem printf Funkcja w C biblioteki standardowej. Komunikat o błędzie może zawierać maksymalnie 2,047 znaków.Jeśli komunikat zawiera co najmniej 2048 znaków, są wyświetlane tylko pierwszy 2,044 i wielokropek jest dodawany do wskazania, że wiadomość została obcięta.Należy zauważyć, że parametrów podstawienia zajmują więcej znaków niż przedstawiono dane wyjściowe z powodu wewnętrznego przechowywania działania.Na przykład Podstawienie parametru %d z przypisaną wartość 2 faktycznie daje jeden znak w ciąg wiadomości, ale także wewnętrznie zajmuje trzy dodatkowe znaki magazynowania. To wymaganie magazynowania zmniejsza liczbę znaków dostępnych dla danych wyjściowych wiadomości.

    Kiedy msg_str jest określony, RAISERROR wywołuje komunikat o błędzie z błędy o numerach 50 000.

    msg_str to ciąg znaków ze specyfikacjami opcjonalne konwersji osadzone.Każda specyfikacja konwersji definiuje sposób wartości na liście argumentów wówczas jest sformatowane i umieszczone w lokalizacji ustawienia konwersji pole msg_str. Specyfikacje konwersji mają w tym formacie:

    % [[flag] [width] [. precision] [{h | l}]type

    Parametry, które mogą być używane w msg_str są następujące:

  • flag

    Jest kodem, który określa odstępy i uzasadnienie podstawione wartości.

    Code

    Prefiks lub justowanie

    Description

    -(minus)

    Uzasadnione z lewej

    Wyjustować do lewej w obrębie danego pole Szerokość wartość argumentu.

    + (plus)

    Symbol prefiksu

    Należy poprzedzić wartość argumentu ze znakiem plus (+) lub minus (-), jeśli wartość jest typu podpisane.

    0 (zero)

    uzupełnienie zerową

    Dane wyjściowe zerami należy poprzedzić, aż do osiągnięcia minimalnej szerokości.Gdy pojawi się 0 i znakiem minus (-), 0 jest ignorowana.

    # (numer)

    0 x prefiksu dla szesnastkowego typ x lub X

    W przypadku użycia z o, x lub X formatu, znak numeru () #flag prefaces dowolną wartość różną od zera, 0, 0 x lub 0 X, odpowiednio.Gdy d, i lub u jest poprzedzona znakiem numeru () #flag, flaga jest ignorowana.

    "" (pusty)

    uzupełnienie miejsca

    Jeśli wartość jest podpisane i pozytywne, należy poprzedzić wartość dane wyjściowe z pustych miejsc.To jest ignorowana, jeśli z flagą znak plus (+).

  • width

    Jest liczbą całkowitą, która określa minimalną szerokość pole, w którym znajduje się wartość argumentu.Jeśli długość wartość argumentu jest równa lub przekracza width, wartość jest drukowana z nie uzupełnienie. Jeśli wartość jest krótszy niż width, wartość jest wypełniane do długości określonej w width.

    Gwiazdka ** oznacza, że szerokość została określona przez argument skojarzone listy argumentów, które musi być wartością całkowitą.

  • precision

    Jest największą liczbą z wartość argumentu dla wartości ciąg znaków.Na przykład jeśli ciąg zawiera pięć znaków i dokładność jest 3, używane są tylko trzy pierwsze znaki wartości ciągu.

    Dla wartości całkowitych precision jest minimalną liczbę cyfr drukowane.

    Gwiazdka ** oznacza, że dokładność została określona przez argument skojarzone listy argumentów, które musi być wartością całkowitą.

  • {h | l} type

    Jest używana z d typów znaków, i, o, s, x, X lub u, a następnie tworzy shortint (h) or longint (l) wartości.

    Określenie typów

    Reprezentuje

    d lub I

    Całkowita

    o

    Liczba ósemkowa, niepodpisanych

    s

    String

    u

    Liczba całkowita bez znaku

    x lub X

    Szesnastkowa bez znaku

    Uwaga

    Specyfikacje te typu są oparte na te, które pierwotnie zostały zdefiniowane dla printf Funkcja w C biblioteki standardowej. Specyfikacja typu używane na mapie ciągi komunikatów RAISERROR do Transact-SQL typy danych, podczas specyfikacje wykorzystywane w printf mapowania danych języka C typów. W specyfikacji typu printf nie są obsługiwane przez RAISERROR po Transact-SQL nie ma typ danych, podobnie jak typ danych C. Na przykład %p Specyfikacja wskaźników nie jest obsługiwany w RAISERROR, ponieważ Transact-SQL nie ma typu danych wskaźnika.

    Uwaga

    To convert a value to the Transact-SQLbigint data type, specify %I64d.

  • **@**local_variable
    Jest zmienną dowolnego typu danych prawidłowych znaków, który zawiera ciąg, sformatowane w taki sam sposób, jak msg_str. **@**local_variable must be char lub varchar, lub być w stanie są niejawnie konwertowane na te typy danych.

  • severity
    Jest to poziom ważności zdefiniowanej przez użytkownika skojarzonego z tą wiadomością.Podczas korzystania z msg_id Aby podnieść utworzone przy użyciu wiadomości przez użytkownika sp_addmessage, wskaźnik ważności, określona w instrukcji RAISERROR zastępuje wskaźnik ważności, określone w sp_addmessage.

    Poziomy ważności, od 0 do 18 może zostać określony przez dowolnego użytkownika.Poziomy ważności, od 19 do 25 może być określony tylko przez członków sysadmin stała rola serwera lub użytkownicy z uprawnieniami ALTER TRACE.Poziomy ważności, od 19 do 25 Opcja WITH dziennik jest wymagane.

    Ostrzeżenie

    Poziomy ważności, od 20 do 25 są uważane za krytyczne.Jeśli napotka poziom krytyczny wskaźnik ważności dla klient jest przerywane po odebraniu wiadomości, a błąd jest rejestrowany w dzienniku w dziennikach aplikacji i błąd.

    Uwaga

    Wskaźnik ważności poziomach mniej niż 0, są interpretowane jako 0.Poziomy ważności większą niż 25, są interpretowane jako 25.

  • state
    Jest liczbą całkowitą z zakresu od 0 do 255.Ujemne wartości lub wartości większej niż 255 generuje błąd.

    Jeśli ten sam błąd zdefiniowany przez użytkownika jest uruchamiany w wielu miejscach, stosując stanu unikatowy dla każdej lokalizacji może pomóc w wyszukiwanie, które części kodu jest zwiększenie błędy.

  • argument
    Parametry używane w podstawienia dla zmiennych są zdefiniowane w msg_str lub komunikat odpowiadający msg_id. Może wynosić 0 lub więcej parametrów podstawienia, ale liczba parametrów podstawienia nie może przekraczać 20.Każdy parametr podstawiania może być zmienną lokalną lub któregokolwiek z tych typów danych: tinyint, smallint, int, char, varchar, nchar, nvarchar, binary, lub varbinary. Inne typy danych są obsługiwane.

  • option
    Jest to opcja niestandardowy błąd i może mieć jedną z wartości w tabela poniżej.

    Wartość

    Description

    DZIENNIK

    Logs the error in the error log and the application log for the instance of the Microsoft SQL Server Database Engine.Błędy zarejestrowane dziennik błędów są obecnie ograniczone do maksymalnie 440 bajtów.Tylko element członkowski członkowski sysadmin stałych roli serwera lub użytkownik z uprawnieniami ALTER TRACE można określić WITH dziennik.

    NOWAIT

    Natychmiast wysyła wiadomości do klient.

    SETERROR

    Ustawia @@ błąd i ERROR_NUMBER wartości msg_id lub 50 000, niezależnie od poziom ważności.

Remarks

Błędy generowane przez RAISERROR działają tak samo, jak błędy generowane przez Database Engine Kod. Wartości określone przez RAISERROR są raportowane przez funkcje systemowe ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE i @@ błąd.Po uruchomieniu z ważności 11 lub wyższy w blok TRY RAISERROR przekazuje sterowanie do skojarzonego blok CATCH.Błąd jest zwracana do obiektu wywołującego, jeśli jest uruchamiany RAISERROR:

  • Poza zakres wszelkie TRY blok.

  • O ważności 10 lub niżej w blok TRY.

  • Z waga 20 lub nowszej, która kończy połączenia z bazą danych.

CATCH bloki umożliwia RAISERROR rethrow błędu, która wywołała blok CATCH za pomocą funkcje systemowe, takich jak ERROR_NUMBER i ERROR_MESSAGE odtworzyć pierwotne informacje o błędzie.Błąd @@ jest domyślnie ustawiona na 0 dla wiadomości o ważności od 1 do 10.Aby uzyskać więcej informacji zobaczZa pomocą TRY... CATCH instrukcji języka Transact-SQL.

Kiedy msg_id Określa dostępne z zdefiniowanych przez użytkownika wiadomości sys.messages wykazu widoku RAISERROR przetwarza wiadomość z kolumna tekstu przy użyciu tych samych reguł, jak są stosowane do tekstu wiadomości przez użytkownika określone za pomocą msg_str. Tekst zdefiniowany przez użytkownika wiadomości może zawierać specyfikacje konwersji i RAISERROR będzie mapować wartości argumentu do specyfikacje konwersji.Użycie sp_addmessage Dodawanie komunikaty zdefiniowane przez użytkownika i sp_dropmessage , aby usunąć błąd zdefiniowany przez użytkownika wiadomości.

RAISERROR może służyć jako alternatywa dla PRINT do zwracania wiadomości wywołaniem aplikacji.RAISERROR obsługuje podstawianie znaków, które są podobne do funkcji printf Funkcja w C biblioteki standardowej, podczas gdy Transact-SQL Nie ma instrukcja drukowania. Instrukcja PRINT nie dotyczy bloki TRY podczas wykonywania instrukcji RAISERROR o ważności 11-19 w blok TRY przekazuje sterowanie do skojarzonego blok CATCH.Należy określić wagę 10 lub niższym używania RAISERROR powinna zwrócić komunikat z blok TRY bez wywoływania blok CATCH.

Zazwyczaj kolejne argumenty zastąpić specyfikacje konwersji kolejnych; pierwszy argument zastępuje ustawienia konwersji pierwszego, drugiego argumentu zastępuje ustawienia konwersji drugiej i tak dalej.Na przykład w następującej RAISERROR w pierwszym argumencie instrukcja N'number' zastępuje pierwsze specyfikacja konwersji %s; a w drugim argumencie 5 zastępuje drugiego specyfikacja konwersji %d.

RAISERROR (N'This is message %s %d.', -- Message text.
           10, -- Severity,
           1, -- State,
           N'number', -- First argument.
           5); -- Second argument.
-- The message text returned is: This is message number 5.
GO

Jeśli gwiazdka ** określono szerokość lub precyzji ustawienia konwersji, jako wartość argumentu jest określona wartość do szerokości lub precyzji.W takim przypadek jednego ustawienia konwersji, można użyć maksymalnie trzy argumenty, jedną dla wartości szerokości, dokładność i zamiany.

Na przykład obie następujące czynności RAISERROR instrukcje zwraca ten sam ciąg. Jeden określa wartości szerokości i precyzję w liście argumentów; drugi określa specyfikacji konwersji.

RAISERROR (N'<<%*.*s>>', -- Message text.
           10, -- Severity,
           1, -- State,
           7, -- First argument used for width.
           3, -- Second argument used for precision.
           N'abcde'); -- Third argument supplies the string.
-- The message text returned is: <<    abc>>.
GO
RAISERROR (N'<<%7.3s>>', -- Message text.
           10, -- Severity,
           1, -- State,
           N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO

Przykłady

A.Powrót z blok CATCH informacje o błędach

Poniższy przykład kodu pokazuje, jak używać RAISERROR wewnątrz TRY blok, aby spowodować wykonanie przejść do skojarzonym CATCH blok. Ponadto przedstawia sposób używania RAISERROR Aby przywrócić informacje o błędzie, która wywołała CATCH blok.

Uwaga

RAISERROR tylko generuje błędy ze stanem od 1 do 127.Ponieważ Database Engine może podnieść błędy ze stanem 0, zaleca się sprawdzenie stanu błędu zwrócony przez ERROR_STATE przed przekazaniem go jako wartość parametru stanu RAISERROR.

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block.
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return error
    -- information about the original error that caused
    -- execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;

B.Tworzenie wiadomości ad hoc w sys.messages

W poniższym przykładzie pokazano, jak podnieść wiadomości przechowywanych w sys.messages Służy do wyświetlania katalogu. Wiadomość została dodana do sys.messages wykazu widoku przy użyciu sp_addmessage procedury zapisanej w systemie jako numer komunikatu 50005.

sp_addmessage @msgnum = 50005,
              @severity = 10,
              @msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
           10, -- Severity,
           1, -- State,
           N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO

C.Za pomocą zmiennej lokalnej podania tekstu wiadomości

W poniższym przykładzie kodu pokazano, jak użyć zmiennej lokalnej do dostarczania tekst komunikatu dla RAISERROR Instrukcja.

DECLARE @StringVariable NVARCHAR(50);
SET @StringVariable = N'<<%7.3s>>';

RAISERROR (@StringVariable, -- Message text.
           10, -- Severity,
           1, -- State,
           N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO