TSQL-Erfolg oder Misserfolg resultiert aus EXEC Dynamic SQL

Aug 26 2020

Basierend auf dem folgenden Code:

/* This SP takes a query and a unique temporary table name as input... 
The outputs is a string with the command to create the tmp table based on the query that is given in the @SRC parameter 
*/ 
EXEC dbo.createTmpFromQuery @SRC,@uniqueTMP,@createTmpStr=@SQLStr OUTPUT
/* This executed the query that will create the tmp table and insert the data from @SRC */
EXEC(@SQLStr)

Die gesamte gespeicherte Prozedur, die diese beiden Zeilen (unter anderem) aufruft, befindet sich in einem Try Catch. Ich bin gerade auf ein Problem gestoßen, bei dem die Abfrage in @SRC einen Syntaxfehler hatte, der den Catch-Teil aufgerufen hat:

BEGIN CATCH
        ROLLBACK TRANSACTION;
        SET @ERRORMESSAGE=CASE WHEN @ERRORMESSAGE='' THEN ERROR_MESSAGE() ELSE @ERRORMESSAGE END 
        RAISERROR (@ERRORMESSAGE,16,1)
END CATCH

Der Versuch hat viele Validierungen und ich habe @ErrorMessage in den meisten Fällen auf personalisierte Nachrichten gesetzt. In diesem Fall möchte ich eine personalisierte Nachricht festlegen, anstatt die Standardfehlermeldung zu erhalten

(example): Incorrect syntax near 'FROM'.

Ich versuche herauszufinden, wie ich die EXEC (@SqlStr) dazu bringen kann, einen erfolgreichen oder fehlerhaften Code zurückzugeben, damit ich die @ErrorMessage festlegen kann, bevor sie in den Catch-Teil des Codes geht.

Antworten

1 JohnG Aug 26 2020 at 21:09

Ich habe die Lösung gefunden ... Ich habe die Anweisungen in einen anderen Try-Catch innerhalb des großen Try-Catchs eingeschlossen (wusste nicht, dass wir das können) :-(

    BEGIN TRY 
        EXEC dbo.createTmpFromQuery @SRC,@uniqueTMP,@createTmpStr=@SQLStr OUTPUT
        EXEC(@SQLStr)
    END TRY
    BEGIN CATCH 
        SET @ErrorMessage='Error Creating '+@uniqueTMP+' table - verify query in @SRC'
        RAISERROR(@ErrorMessage,16,1)
    END CATCH 

Ich habe es getestet und es hat funktioniert. Ich hoffe das hilft jemand anderem ...