Succès ou échec TSQL du SQL dynamique EXEC

Aug 26 2020

Basé sur le code suivant:

/* 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)

L'ensemble de la procédure stockée qui appelle ces 2 lignes (parmi beaucoup d'autres) se trouve dans un Try Catch. Je viens de rencontrer un problème où la requête dans @SRC avait une erreur de syntaxe qui a appelé la partie Catch:

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

le Try a de nombreuses validations et j'ai défini @ErrorMessage sur des messages personnalisés dans la plupart des cas. Dans ce cas, je souhaite définir un message personnalisé au lieu d'obtenir le message d'erreur standard

(example): Incorrect syntax near 'FROM'.

J'essaie de comprendre comment je peux obtenir le retour EXEC (@SqlStr) d'un code de réussite ou d'échec, afin que je puisse définir le @ErrorMessage avant qu'il n'entre dans la partie catch du code.

Réponses

1 JohnG Aug 26 2020 at 21:09

J'ai trouvé la solution ... J'ai enveloppé les déclarations dans un autre try catch dans le grand try catch (je ne savais pas que nous pouvons le faire) :-(

    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 

Je l'ai testé et cela a fonctionné. J'espère que cela aidera quelqu'un d'autre ...