Bây giờ chúng tôi có tất cả các giải thích về lý do tại sao điều này xảy ra. Hãy xem một giải pháp thực tế cho vấn đề.
Trước tiên, hãy đưa ra các tuyên bố mà @ d-k-mulligan đề xuất ở trên và biến chúng thành các procs được lưu trữ.
IF OBJECT_ID('dbo.prcIDontExistINSERT', 'P') IS NOT NULL DROP PROCEDURE dbo.prcIDontExistINSERT
GO
CREATE PROCEDURE dbo.prcIDontExistINSERT
AS
BEGIN TRY
INSERT INTO IDontExist(ProductID)
VALUES(1)
END TRY
BEGIN CATCH
SELECT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
GO
IF OBJECT_ID('dbo.prcIDontExistSELECT', 'P') IS NOT NULL DROP PROCEDURE dbo.prcIDontExistSELECT
GO
CREATE PROCEDURE dbo.prcIDontExistSELECT
AS
BEGIN TRY
SELECT * FROM IDontExist
END TRY
BEGIN CATCH
SELECT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
GO
Nếu chúng tôi chạy một trong số chúng, chúng tôi sẽ thấy lỗi tương tự.
EXEC dbo.prcIDontExistINSERT
EXEC dbo.prcIDontExistSELECT
Msg 208, Level 16, State 1, Procedure prcIDontExistSELECT, Line 4
Invalid object name 'IDontExist'.
Bây giờ, giải pháp là tạo lỗi xử lý các trình bao bọc với mục đích duy nhất là bắt lỗi từ các procs gốc phía trên đang nhận được lỗi không tìm thấy đối tượng.
IF OBJECT_ID('dbo.prcIDontExistInsert_ERROR_HANDLER', 'P') IS NOT NULL DROP PROCEDURE dbo.prcIDontExistInsert_ERROR_HANDLER
GO
CREATE PROCEDURE dbo.prcIDontExistInsert_ERROR_HANDLER
AS
BEGIN TRY
EXEC dbo.prcIDontExistINSERT
END TRY
BEGIN CATCH
SELECT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
GO
IF OBJECT_ID('dbo.prcIDontExistSELECT_ERROR_HANDLER', 'P') IS NOT NULL DROP PROCEDURE dbo.prcIDontExistSELECT_ERROR_HANDLER
GO
CREATE PROCEDURE dbo.prcIDontExistSELECT_ERROR_HANDLER
AS
BEGIN TRY
EXEC dbo.prcIDontExistSELECT
END TRY
BEGIN CATCH
SELECT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
GO
Cuối cùng, hãy chạy một trong các lỗi xử lý procs của chúng tôi và xem thông báo mà chúng tôi mong đợi.
EXEC dbo.prcIDontExistInsert_ERROR_HANDLER
EXEC dbo.prcIDontExistSELECT_ERROR_HANDLER
There was an error! Invalid object name 'IDontExist'.
LƯU Ý: Kalman Toth đã làm tất cả các công trình nghiên cứu khó khăn ở đây: http://www.sqlusa.com/articles2008/trycatch/
Nguồn
2013-09-06 21:46:52
Bất kỳ phản hồi nào về câu trả lời của chúng tôi, vui lòng? Tôi khá tò mò về cách bạn nhận được ... – gbn
Câu hỏi muộn: nếu bạn chạy DBCC FREEPROCCACHE để buộc biên dịch lại – gbn