Wat is de SYNTAX-betekenis van RaisError ()

Ik heb zojuist een in plaats daarna gemaakt nadat Trigger wiens syntaxis hieronder wordt gegeven:

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

In de bovenstaande syntaxis heb ik het gebruik gemaakt van RAISERROR('Cannot Insert where salary > 1000',16,1)

Maar wanneer ik schrijf RAISERROR('Cannot Insert where salary > 1000')het geeft de fout “onjuiste syntaxis in de buurt van ‘)'” op dezelfde regel.

Kan iemand hier het gebruik van (16,1) uitleggen.


Antwoord 1, Autoriteit 100%

Het is het ernstniveau van de error. De niveaus zijn van 11 – 20 die een fout in de SQLgooien. Hoe hoger het niveau, hoe zwaarder het niveau en de transactionmoeten worden afgebroken.

U krijgt de syntaxisfout wanneer u het doet:

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

Omdat u de juiste parameters(severity levelof state) niet hebt opgegeven.

Als u een waarschuwing wilt geven en geen exception, gebruikt u niveaus 0 – 10.

Van MSDN:

ernst

Is het door de gebruiker gedefinieerde ernst niveau in verband met dit bericht. Wanneer
met behulp van msg_id om een ​​door de gebruiker gedefinieerde bericht te verhogen gemaakt met behulp van
sp_addmessage, de ernst vermeld op RAISERROR voorrang op de
ernst vermeld in sp_addmessage. Ernstniveaus van 0 tot 18
kan worden gespecificeerd door een gebruiker. Ernst niveaus van 19 tot 25 can
alleen worden opgegeven door de leden van de vaste serverrol sysadmin of
gebruikers met ALTER TRACE toestemmingen. Voor ernstniveaus vanaf 19
tot en met 25, wordt de optie MET LOG vereist.

stand

Is een geheel getal tussen 0 en 255. Negatieve waarden of waarden
groter dan 255 genereert een fout. Als dezelfde gebruiker gedefinieerde fout
verhoogde op verschillende plaatsen, onder gebruikmaking van een uniek nummer voor elke toestand
locatie kan helpen bij het vinden welk deel van de code is het verhogen van de fouten.
Voor gedetailleerde beschrijving hier


Antwoord 2, Autoriteit 51%

16 is de ernst en 1 staat, kan meer specifiek volgende voorbeeld u meer informatie over syntaxis en het gebruik te geven:

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;

U kunt meer voorbeelden volgen en uitproberen van http://msdn.microsoft .com / en-US / Library / MS178592.aspx


Antwoord 3, Autoriteit 18%

Volgens MSDN

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

16zou de ernst zijn.
1zou de staat zijn.

De fout die u krijgt, is omdat u de vereiste parameters niet goed hebt geleverd voor de RAISEERRORFunctie.


Antwoord 4, Autoriteit 10%

Het ernstniveau 16 in uw voorbeeldcode wordt meestal gebruikt voor door de gebruiker gedefinieerde (door de gebruiker gedetecteerde) fouten. De SQL Server DBMS zelf uitstoot ernstsniveaus (en foutmeldingen) voor problemen Het detecteert, zowel ernstiger (hogere nummers) als minder (lagere nummers).

De staat moet een geheel getal zijn tussen 0 en 255 (negatieve waarden zullen een fout geven), maar de keuze is eigenlijk de programmeur. Het is handig om verschillende staatswaarden te plaatsen als hetzelfde foutmelding voor door de gebruiker gedefinieerde fout op verschillende locaties zal worden verhoogd, b.v. Als de foutopsporing / probleemoplossing van problemen zal worden bijgestaan ​​door een extra indicatie te hebben van waar de fout is opgetreden.


Antwoord 5, Autoriteit 4%

Het antwoord op deze vraag is als voorbeeld genomen uit Microsoft’s MSDNis leuk, maar het laat niet direct zien waar de fout vandaan komt als deze niet uit het TRY-blok komt. Ik geef de voorkeur aan dit voorbeeld met een zeer kleine update van het RAISERROR-bericht in het CATCH-blok waarin staat dat de fout afkomstig is van het CATCH-blok. Ik demonstreer dit ook in de gif.

BEGIN TRY
    /* RAISERROR with severity 11-19 will cause execution
     |  to jump to the CATCH block.
    */
    RAISERROR ('Error raised in TRY block.', -- Message text.
               5, -- Severity. /* Severity Levels Less Than 11 do not jump to the CATCH block */
               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 ('Caught Error in Catch', --@ErrorMessage, /* Message text */
               @ErrorSeverity,                           /* Severity     */
               @ErrorState                               /* State        */
               );
END CATCH;

Other episodes