Potresti voler iniziare a utilizzare PROVA..CATCH bloccare le tue procedure
Quindi la tua procedura potrebbe essere riscritta come:
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
Inoltre, tieni presente che stai eseguendo come istruzione di eliminazione singola. Significa che non ha bisogno di essere avvolto in una transazione. Questo la domanda spiega perché.
Il tuo codice diventa questo:
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
Ora perché il tuo @errMessage
è sempre NULLA? Perché ERROR_MESSAGE()
è valido SOLO IN CATCH BLOCK. Questo è scritto nella documentazione
:
Utilizzo di TRY..CATCH in Transact-SQL dice questo: