Succès ou échec TSQL du SQL dynamique EXEC
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
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 ...