Możesz zacząć używać TRY..CATCH blokowanie w procedurach
Więc twoja procedura może zostać przepisana jako:
CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
DELETE
FROM Test
WHERE ID = @ID;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH
END
Pamiętaj też, że działasz jako pojedyncza instrukcja usuwania. Oznacza to, że nie trzeba go wiązać z transakcją. To pytanie wyjaśnia dlaczego.
Twój kod staje się taki:
CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DELETE
FROM Test
WHERE ID = @ID;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH
END
Teraz dlaczego Twój @errMessage
jest zawsze NULL? Ponieważ ERROR_MESSAGE()
obowiązuje TYLKO W BLOKACH PRZEŁAPOWYCH. Jest to napisane w dokumentacji
:
Korzystanie z TRY..CATCH w Transact-SQL mówi to: