Може да искате да започнете да използвате ОПИТАЙТЕ..ХВАНЕТЕ блокирайте във вашите процедури
Така че вашата процедура може да бъде пренаписана като:
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
Също така, моля, имайте предвид, че работите като единичен израз за изтриване. Това означава, че не е необходимо да бъде обвито в транзакция. Това въпросът обяснява защо.
Вашият код става следния:
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
Сега защо вашето @errMessage
винаги е NULL? Защото ERROR_MESSAGE()
важи САМО В CATCH BLOCK. Това е написано в документация
:
Използване на TRY..CATCH в Transact-SQL казва това: