Sql-Server

EXEC動態SQL的TSQL成功或失敗結果

  • August 26, 2020

基於以下程式碼:

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

呼叫這 2 行(以及許多其他行)的整個儲存過程位於 Try Catch 中。我剛剛遇到了一個問題,@SRC 中的查詢有一個語法錯誤,稱為 Catch 部分:

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

Try 有很多驗證,我在大多數情況下將 @ErrorMessage 設置為個性化消息。在這種情況下,我想設置個性化消息而不是獲取標準錯誤消息

(example): Incorrect syntax near 'FROM'.

我試圖弄清楚如何讓 EXEC(@SqlStr) 返回成功或失敗程式碼,因此我可以在 @ErrorMessage 進入程式碼的擷取部分之前設置它。

我找到了解決方案……我將語句包裝在另一個 try catch 中的大 try catch 中(不知道我們能做到這一點):-(

   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 

我測試了它,它有效。我希望這會幫助別人……

引用自:https://dba.stackexchange.com/questions/274423