En för mig välkommen nyhet som introducerades i SQL Server 2005 är felhantering genom TRY/CATCH.
Innan TRY/CATCH såg felhantering typiskt ut något i den här stilen (lite förenklat):
--create table tabell (fält varchar(10)) DECLARE @error intSET @error=0BEGIN TRANINSERT INTO tabell (fält) VALUES('abcde12345abcde12345')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDINSERT INTO tabell (fält) VALUES('abcdefghijabcdefghij')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDINSERT INTO tabell (fält) VALUES('12345678901234567890')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDCOMMIT TRANPROC_EXIT:
--create table tabell (fält varchar(10))
DECLARE @error intSET @error=0BEGIN TRANINSERT INTO tabell (fält) VALUES('abcde12345abcde12345')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDINSERT INTO tabell (fält) VALUES('abcdefghijabcdefghij')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDINSERT INTO tabell (fält) VALUES('12345678901234567890')SET @error=@@errorIF @error>0BEGIN PRINT @error ROLLBACK TRAN GOTO PROC_EXITENDCOMMIT TRANPROC_EXIT:
Med TRY/CATCH är det kortare och i min mening betydligt mer lättförståligt:
BEGIN TRYBEGIN TRANINSERT INTO tabell (fält) VALUES('12345678901234567890') INSERT INTO tabell (fält) VALUES('abcdefghijabcdefghij') INSERT INTO tabell (fält) VALUES('abcde12345abcde12345')COMMIT TRANEND TRYBEGIN CATCH IF @@TRANCOUNT>0 ROLLBACK TRAN PRINT ERROR_MESSAGE()END CATCH
BEGIN TRYBEGIN TRAN
En avgörande skillnad finns mellan "gamla" och "nya" sättet att felhantera: Med TRY/CATCH kastas inga fel till klienten, så det kan definitivt vara läge att slänga in en RAISERROR i sitt CATCH-block.
Remember Me
a@href@title, strike