Das Problem, das Sie haben, ist, dass der Fehler nicht in der Prozedur auftreten, es auftreten wird, wenn die Prozedur aufrufen. In einem einfachen Beispiel, erstellen Sie das folgende Verfahren:
IF OBJECT_ID(N'dbo.ErrorCatchTest', 'P') IS NOT NULL
DROP PROCEDURE dbo.ErrorCatchTest;
GO
CREATE PROCEDURE dbo.ErrorCatchTest @int INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @T TABLE (I INT);
INSERT @T (I) VALUES (5.0/@int);
SELECT 'OK';
END TRY
BEGIN CATCH
SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
END CATCH
END;
Wenn ich eine gültige INT
an die Prozedur übergeben:
EXECUTE dbo.ErrorCatchTest @int = 1;
Die ich OK
nach Bedarf.
Wenn ich 0
ein Pass, einen Fehler zu erzwingen:
EXECUTE dbo.ErrorCatchTest @int = 0;
Sie erhalten die Fehlermeldung je nach Bedarf, aber wenn ich eine ungültige ganze Zahl passieren versuchen:
EXECUTE dbo.ErrorCatchTest @int = 'Not a number';
Dann bekomme ich die Fehlermeldung, weil der Fehler nicht innerhalb der Prozedur ist, aber während eine implizite Konvertierung auf den Parametern.
Die Art und Weise, um dieses ist das Verfahren innerhalb eines try/catch-Block zu nennen:
mit der Datenbank Sie verwenden
BEGIN TRY
EXECUTE dbo.ErrorCatchTest @int = 'Not a number';
END TRY
BEGIN CATCH
SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
END CATCH
Tag Ihre Frage. Zeigen Sie auch Beispieldaten an, die zum Fehlschlagen des Codes führen. –
Markieren Sie die von Ihnen verwendeten dbms. (Sieht aus wie produktspezifischer Code.) – jarlh
Anstatt sich darüber Gedanken zu machen, wie Sie die Fehlermeldung abfangen können, beheben Sie sie nicht. Die wahrscheinlichste Weise, die ich sehen kann, dass Sie diesen Fehler auslösen können, ist, wenn '@ projectStartDate' an die Prozedur/Abfrage als varchar übergeben wird. Ändern Sie einfach die Datentypen der Parameter, um sie den Datentypen der Spalten anzupassen, und Sie haben Ihr Problem gelöst. Wenn Sie darauf bestehen, falsche Datentypen zu verwenden und den Fehler zu behandeln, können Sie ['ERROR_MESSAGE()'] (https://msdn.microsoft.com/en-us/library/ms190358.aspx) verwenden, um es zu erfassen. – GarethD