2016-03-30 14 views
0

Ich frage mich, warum SQL Server nicht in der Lage ist, das error_procedure auszuführen, während das dynamische SQL in einer Prozedur ausgeführt wird. Es ist mir möglich, den Prozedurnamen in der Fehlermeldung in Szenario 2 aufzurufen?Geladener Prozedurname während der Ausführung von Fehlerdynamischen SQL

Szenario 1:

CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    EXEC SELECT 1/0 
END 
GO 

EXEC TEST_PROCEDURE 

Fehlermeldung:

Msg 8134, Ebene 16, Status 1, Prozedur TEST_PROCEDURE, Line 6
Division durch Null Fehler aufgetreten.

Szenario 2:

CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    EXEC('SELECT 1/0') 
END 
GO 

EXEC TEST_PROCEDURE 

Fehlermeldung:

Msg 8134, Ebene 16, Status 1, Zeile 1
Division durch Null Fehler aufgetreten.

+3

Uh, Ihr erstes Szenario wird immer einen Fehler, wenn das Verfahren zu schaffen, weil Sie nicht die richtige Syntax. EXEC führt eine gespeicherte Prozedur aus (es gibt keine gespeicherte Prozedur "SELECT"). EXEC() führt jeden Parameter aus, den Sie in die Klammern setzen. Um eine benutzerdefinierte Fehlermeldung mit dem Prozedurnamen auszugeben, fügen Sie eine TRY CATCH-Anweisung in Ihre Prozedur ein und fügen Sie eine benutzerdefinierte Fehlernachricht in Ihren CATCH ein. – ZLK

+0

Danke für die Antwort! Ja, ich habe herausgefunden, dass ich den TRY CATCH-Mechanismus verwenden kann, um die Prozedur in Szenario 2 zu bekommen. Abgesehen davon, ist das eine Alternative? – 0070

+1

Es gibt nicht wirklich eine Alternative. TRY CATCH ist die einzige Möglichkeit, spezifische Fehlerinformationen zu erfassen. Beachten Sie außerdem, dass SQL möglicherweise irreführende Informationen zu Fehlern liefert, wenn Sie etwas in einer gespeicherten Prozedur ausführen. z.B. Wenn Sie 100 Codezeilen haben, fügen Sie 'EXEC ('SELECT 1/0')' zur 101. Zeile hinzu, es wird ein Fehler in Zeile 1 angezeigt (weil das die erste Zeile des Codes ist, der gerade ausgeführt wird)). – ZLK

Antwort

0
CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    BEGIN TRY 
     EXEC('SELECT 1/0') 
    END TRY 
    BEGIN CATCH 
     DECLARE @Err VARCHAR(255); 
     SELECT @Err = 'Error in TEST_PROCEDURE. ' + ERROR_MESSAGE() 
     RAISERROR(@Err, 16, -1) 
    END CATCH 
END 
Verwandte Themen