22

Ich habe gerade ein Stattdessen Nach-Trigger, dessen Syntax ist unten angegeben:Was ist die Syntax Bedeutung von 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 

I RAISERROR('Cannot Insert where salary > 1000',16,1)

In der obigen Syntax verwendet haben, aber wenn ich es schreiben RAISERROR('Cannot Insert where salary > 1000') gibt den Fehler "Falsche Syntax in der Nähe von ')" in derselben Zeile an.

Kann jemand bitte die Verwendung von (16,1) hier erklären.

+0

Die Syntax von 'RaIsError' wird [hier] erklärt (http://msdn.microsoft.com/en-us/library/ms178592 (v = sql.100) .aspx). – HABO

+3

Dieser Trigger ist defekt - er geht davon aus, dass es in 'inserted' eine * einzelne * Zeile gibt, während in 'insert' tatsächlich 0, 1 oder * viele * Zeilen vorhanden sein können. –

Antwort

37

Es ist der Schweregrad des Fehlers. Die Level reichen von 11 - 20, die einen Fehler in SQL auslösen. Je höher die Stufe, desto schwerer die Stufe und die Transaktion sollte abgebrochen werden.

Sie den Syntaxfehler erhalten, wenn Sie tun:

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

Weil Sie die korrekten Parameter (Schweregrad oder Zustand) nicht angegeben haben.

Wenn Sie wünschen, eine Verwarnung erteilen und keine Ausnahme, Verwendung Level 0 - 10.

Von MSDN:

Schwere

Ist der benutzerdefinierten Schweregrad damit verbundenen Botschaft. Wenn msg_id verwendet, um eine benutzerdefinierte Nachricht zu erstellen, die mit sp_addmessage erstellt wurde, überschreibt der Schweregrad, der in RAISERROR angegeben wurde, den in sp_addmessage angegebenen Schweregrad . Schweregrade von 0 bis 18 können von jedem Benutzer angegeben werden. Die Schweregrade von 19 bis 25 können nur von Mitgliedern der festen Serverrolle sysadmin oder Benutzern mit ALTER TRACE-Berechtigungen angegeben werden. Für die Schweregrade von 19 bis 25 ist die Option WITH LOG erforderlich.

Zustand

eine ganze Zahl von 0 bis 255. Negative Werte oder Werte größer als 255 einen Fehler erzeugen. Wenn derselbe benutzerdefinierte Fehler an mehreren Standorten ausgelöst wird, kann die Verwendung einer eindeutigen Statusnummer für jeden Standort helfen, den Codeabschnitt zu finden, der die Fehler erhöht.

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

+0

Danke, deine Antwort löscht mein Konzept, aber kannst du bitte das Konzept hinter dem State auch, den dritten Parameter der RAISERROR() erklären. – user2289490

+2

@ user2289490 - es kann einfach verwendet werden, um festzustellen, wo der Fehler ausgelöst wurde. I.e. Wenn Sie einen Fehler mit Status 1 und dann einen anderen Fehler (in einem anderen Teil Ihrer gespeicherten Prozedur) auslösen, können Sie verfolgen, welcher Teil der Prozedur die Ausnahme ausgelöst hat. –

8

nach MSDN

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

16 würde die Schwere sein.
1 wäre der Staat.

Der Fehler liegt darin, dass Sie die erforderlichen Parameter für die Funktion RAISEERROR nicht ordnungsgemäß angegeben haben.

11

16 ist Schwere und 1 Zustand, insbesondere folgende Beispiel könnten Sie weitere Einzelheiten über Syntax und Verwendung geben:

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; 

Sie können weitere Beispiele folgen und versuchen, aus http://msdn.microsoft.com/en-us/library/ms178592.aspx

3

Der Schweregrad 16 in Ihrem Beispielcode wird normalerweise für benutzerdefinierte (user-detected) Fehler verwendet. Das SQL Server DBMS selbst gibt severity levels (und Fehlermeldungen) für Probleme aus, die es erkennt, sowohl schwerer (höhere Zahlen) als auch weniger (niedrigere Zahlen).

Der Zustand sollte eine ganze Zahl zwischen 0 und 255 sein (negative Werte geben einen Fehler), aber die Wahl ist im Grunde die des Programmierers. Es ist nützlich, verschiedene Statuswerte einzugeben, wenn die gleiche Fehlernachricht für einen benutzerdefinierten Fehler an verschiedenen Stellen, z. Wenn das Debugging/Troubleshooting von Problemen unterstützt wird, durch eine zusätzliche Angabe, wo der Fehler aufgetreten ist.