Bạn có thể muốn bắt đầu sử dụng THỬ..CATCH chặn trong thủ tục của bạn
Vì vậy, thủ tục của bạn có thể được viết lại thành:
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
Ngoài ra, xin lưu ý rằng bạn đang chạy dưới dạng câu lệnh xóa duy nhất. Nó có nghĩa là nó không cần phải được gói gọn trong một giao dịch. Điều này câu hỏi giải thích tại sao.
Mã của bạn trở thành thế này:
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
Bây giờ tại sao @errMessage
của bạn luôn luôn là NULL? Bởi vì ERROR_MESSAGE()
CHỈ có hiệu lực TRONG KHỐI CÁT. Nội dung đó được viết trong tài liệu
:
Sử dụng TRY..CATCH trong Transact-SQL nói với điều này: