Možná budete chtít začít používat TRY..CATCH zablokovat ve svých postupech
Takže váš postup by mohl být přepsán 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
Také si prosím uvědomte, že používáte jeden příkaz delete. To znamená, že to není nutné zabalit do transakce. Toto otázka vysvětluje proč.
Váš kód bude tento:
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
Nyní proč vaše @errMessage
je vždy NULL? Protože ERROR_MESSAGE()
platí POUZE V BLOKOVÁNÍ ÚLOVKŮ. To je napsáno v dokumentace
:
Použití TRY..CATCH v Transact-SQL říká toto: