Vous voudrez peut-être commencer à utiliser TRY..CATCH bloquer dans vos procédures
Ainsi, votre procédure pourrait être réécrite comme :
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
Notez également que vous exécutez une instruction de suppression unique. Cela signifie qu'il n'a pas besoin d'être enveloppé dans une transaction. Ceci la question explique pourquoi.
Votre code devient ceci :
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
Maintenant pourquoi votre @errMessage
est toujours NULL ? Parce que ERROR_MESSAGE()
est valide UNIQUEMENT DANS LE BLOC CATCH. C'est écrit dans la documentation
:
Utilisation de TRY..CATCH dans Transact-SQL dit ceci :