V určitých situacích potřebujeme uvnitř SQL skriptu zavolat chybu a skript přerušit. Typickým případe je třeba nesplnění nějakého data quality checku nebo potřeba zavilat příkaz uvnitř BEGIN /END TRY BEGIN/END CATCH konstrukce. V podobných případech můžeme použít příkaz RAISERROR nebo novější příkaz THROW. V tomto článku se podíváme na první zmíněný příkaz. Příkaz THROW je jednodušší.
Syntaxe RAISERROR v SQL serveru
Syntaxe je jednoduchá a příkaz obsahuje 3 argumenty
RAISERROR (msg ,severity, state)
- msg (message/zpráva) – error hláška
- severity – závažnost chyby, může abývat hodnot 0-25. Tady bych doporučil prostudovat článek SQL Error hlášky a závažnost (severity). Severity <17 nezpůsobí přerušení skriptu – ukážu dále.
- state – nabývá hodnot 0 – 255, volitelný
Příklad Informace, User Error a Severity >17
- Severity 0 – 10 => informace
- 11 – 16 => user error
- 17 – 25 => další různé typy chyb. Až tyto severities způsobují přeřušení skriptu
Demonstrovat budu na skriptu níže který spistím 3x – pro severity 8, 16 a 17. Nejprve v TRY části způsobím chybu (dělením nulou) a následně v CATCH část volám RAISERROR s různými severitami.
BEGIN TRY
SELECT 1/0 –Error
END TRY
BEGIN CATCH
RAISERROR (‘Kdo neskáče není Čech….’, 8, 1)
END CATCH
PRINT ‘Hop….’
PRINT ‘Hop….’
PRINT ‘Hop….’
Severity 8 – Toto může být trošku matoucí. Voláme raiserror, ale vidíme, že příkaz nám vrací pouze informaci (text není červeně) a následně skript pokračuje dále na Hop, Hop, Hop.
Severity 16 – Toto je matoucí ještě více..vidíme, že ve výsledku máme error a červený text, ale skript pokračoval dále na Hop, Hop, Hop.
Severity 17 – Až od severity 17 – 25 dojde k přerušení skriptu, takže bacha
Více o RAISERROR v dokumentaci Microsoftu. Výhody THROW oproti RAISERROR popisuje třeba Pinal Dave – Convert Old Syntax of RAISEERROR to THROW.
Zajímá vás jak se řeší error handling? Můžete si přečíst tento článek – SQL TRY CATCH – Error handling.