Teraz, gdy mamy wszystkie wyjaśnienia, dlaczego tak się dzieje. Zobaczmy rzeczywiste rozwiązanie problemu.
Najpierw weźmy oświadczenia, które @ d-k-mulligan zaproponował powyżej i przekształć je w przechowywane proc.
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
Jeśli uruchomimy którykolwiek z nich, widzimy ten sam błąd.
EXEC dbo.prcIDontExistINSERT
EXEC dbo.prcIDontExistSELECT
Msg 208, Level 16, State 1, Procedure prcIDontExistSELECT, Line 4
Invalid object name 'IDontExist'.
Rozwiązanie teraz jest stworzenie obsługi błędów otoki procs wyłącznie w celu złapania żadnego błędu z oryginalnych proca powyżej, które są coraz obiekt nie znaleziono błędów.
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
Wreszcie, uruchommy jeden z naszych procesów obsługi błędów i zobaczmy komunikat, którego oczekujemy.
EXEC dbo.prcIDontExistInsert_ERROR_HANDLER
EXEC dbo.prcIDontExistSELECT_ERROR_HANDLER
There was an error! Invalid object name 'IDontExist'.
UWAGA: Kalman Toth zrobił całą ciężką pracę badawczą tutaj: http://www.sqlusa.com/articles2008/trycatch/
Wszelkie opinie na temat naszych odpowiedzi proszę? Jestem bardzo ciekawa, jak się dostałeś ... – gbn
Późne pytanie: co zrobić, jeśli uruchomisz DBCC FREEPROCCACHE, aby wymusić ponowną kompilację – gbn