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 SQL
gooien. Hoe hoger het niveau, hoe zwaarder het niveau en de transaction
moeten worden afgebroken.
U krijgt de syntaxisfout wanneer u het doet:
RAISERROR('Cannot Insert where salary > 1000').
Omdat u de juiste parameters
(severity level
of 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 ] ]
16
zou de ernst zijn.
1
zou de staat zijn.
De fout die u krijgt, is omdat u de vereiste parameters niet goed hebt geleverd voor de RAISEERROR
Functie.
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;