22

Właśnie stworzyliśmy Zamiast Po wyzwalania którego składnia jest podana poniżej:Jaki jest sens składnia RAISERROR()

Create trigger tgrInsteadTrigger on copytableto 
Instead of Insert as 
    Declare @store_name varchar(30); 
    declare @sales int; 
    declare @date datetime; 

    select @store_name = i.store_name from inserted i 
    select @sales = i.sales from inserted i 
    select @date = i.Date from inserted i 
begin 
    if (@sales > 1000) 
     begin 
     RAISERROR('Cannot Insert where salary > 1000',16,1); ROLLBACK; 
     end 
    else 
     begin 
     insert into copytablefrom(store_name, sales, date) values (@store_name, @sales, @date); 
     Print 'Instead After Trigger Executed'; 
     end 
End 

W powyższej składni użyłem RAISERROR('Cannot Insert where salary > 1000',16,1)

Ale gdy piszę RAISERROR('Cannot Insert where salary > 1000') go podaje błąd "Niepoprawna składnia w pobliżu") "" w tej samej linii.

Może ktoś proszę wyjaśnić zastosowanie (16,1) tutaj.

+0

Składnia 'RaIsError' została wyjaśniona [tutaj] (http://msdn.microsoft.com/en-us/library/ms178592 (v = sql.100) .aspx). – HABO

+3

Ten wyzwalacz jest zepsuty - zakłada, że ​​istnieje * pojedynczy * wiersz w 'wstawionym', podczas gdy w rzeczywistości może być 0, 1 lub * wiele * wierszy w' wstawionym'. –

Odpowiedz

37

Jest to poziom istotności błędu. Poziomy wynoszą od 11 do 20, które powodują błąd w SQL. Im wyższy poziom, tym trudniejszy jest poziom i transakcja.

Otrzymasz błąd składni podczas wykonywania:

RAISERROR('Cannot Insert where salary > 1000'). 

Ponieważ nie określono poprawnych parametrów (poziom istotności lub państwowe).

Jeśli chcesz wydać ostrzeżenie, a nie wyjątek, poziomów stosowania 0 - 10.

Od MSDN:

surowość

Czy poziom istotności zdefiniowany przez użytkownika z tym związane wiadomość. Kiedy użyciu msg_id podnieść komunikat zdefiniowany przez użytkownika tworzone za pomocą sp_addmessage, ciężkości określona na RAISERROR przesłania dotkliwość określonego w sp_addmessage. Poziomy ważności od 0 do 18 mogą być określone przez dowolnego użytkownika. Poziomy ważności od 19 do 25 mogą być określony tylko przez członków sysadmin stała rola serwera lub użytkowników z uprawnieniami ŚLADOWYMI zmienić. Dla poziomów ważności od 19 do 25, wymagana jest opcja ZALOGUJ.

stan

jest liczbą całkowitą od 0 do 255. Wartości ujemne wartości lub większa niż 255 wygeneruje błąd. Jeżeli ten sam błąd zdefiniowany przez użytkownika jest podniesiony w wielu miejscach, przy użyciu unikalnego numeru członkowskiego na każdy lokalizacji może pomóc dowiedzieć się, jakie sekcja kodu jest podniesienie błędów.

http://support.microsoft.com/kb/321903

+0

Dzięki, twoja odpowiedź oczyszcza moją koncepcję, ale możesz wyjaśnić pojęcie stanu, trzeci parametr funkcji RAISERROR(). – user2289490

+2

@ user2289490 - można go po prostu użyć do określenia miejsca, w którym błąd został zgłoszony. To znaczy. jeśli zgłosisz błąd ze stanem 1, a następnie innym błędem (w innej części procedury przechowywanej), możesz prześledzić, która część procedury rzuciła wyjątek. –

8

według MSDN

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

16 będzie ciężkości.
1 byłby stanem.

Błąd masz jest ponieważ nie masz prawidłowo dostarczone wymagane parametry dla funkcji RAISEERROR.

11

16 jest nasilenie i 1 jest państwo, a dokładniej Poniższy przykład może dać więcej szczegółów na temat składni i użycia:

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; 

Możesz śledzić i wypróbować kilka przykładów z http://msdn.microsoft.com/en-us/library/ms178592.aspx

3

poziom istotności 16 w przykładowym kodzie jest zwykle używane do błędów zdefiniowanych przez użytkownika (wykrytych przez użytkownika). Sam DBMS programu SQL Server wysyła severity levels (i komunikaty o błędach) w przypadku wykrytych problemów, zarówno poważniejszych (wyższe liczby), jak i mniej (niższe liczby).

Stan powinien być liczbą całkowitą z przedziału od 0 do 255 (wartości ujemne spowodują błąd), ale wybór jest w zasadzie programatorem. Przydaje się umieszczanie różnych wartości stanu, jeśli ten sam komunikat o błędzie dla błędu zdefiniowanego przez użytkownika zostanie podniesiony w różnych lokalizacjach, np. jeśli debugowanie/rozwiązywanie problemów będzie wspomagane przez dodatkowe wskazanie, gdzie wystąpił błąd.