Vielleicht möchten Sie damit beginnen, TRY..CATCH zu verwenden in Ihren Prozeduren blockieren
Ihre Prozedur könnte also umgeschrieben werden als:
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
Beachten Sie außerdem, dass Sie als einzelne Löschanweisung ausgeführt werden. Dies bedeutet, dass es nicht in eine Transaktion eingewickelt werden muss. Dies Frage erklärt warum.
Ihr Code wird zu diesem:
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
Warum nun Ihre @errMessage
ist immer NULL? Weil ERROR_MESSAGE()
gilt NUR IM CATCH BLOCK. Das steht in der Dokumentation
:
Verwendung von TRY..CATCH in Transact-SQL sagt dies: