Du kanske vill börja använda TRY..CATCH blockera dina rutiner
Så din procedur kan skrivas om som:
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
Observera också att du kör som enkel raderingssats. Det betyder att det inte behöver slås in i en transaktion. Detta frågan förklarar varför.
Din kod blir denna:
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
Varför ditt @errMessage
är alltid NULL? Eftersom ERROR_MESSAGE()
gäller ENDAST I FÅNGSTBLOCK. Det är skrivet i dokumentation
:
Använda TRY..CATCH i Transact-SQL säger detta: