2017-08-17 135 views
1

我需要经常使用TRY..CATCH块执行存储过程。 因此,我写一个存储过程包括TRY..CATCH块+一个输入参数:SQL Server 2012 - 将存储过程名称传递给另一个存储过程

CREATE PROCEDURE [dbo].[exec_sp_with_try_catch] 
    (@pnvcSPName NVARCHAR(100)) 
AS 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 
BEGIN 
    BEGIN TRY 
     exec @pnvcSPName; 
    END TRY 
    BEGIN CATCH 
     SELECT @ErrorMessage = ERROR_MESSAGE(), 
       @ErrorSeverity = ERROR_SEVERITY(), 
       @ErrorState = ERROR_STATE(); 

     RAISERROR(@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
     ); 

     IF XACT_STATE() <> 0 
      ROLLBACK TRANSACTION; 
    END CATCH 

END; 

然后,我可以直接使用上述的存储过程,如果我想与try...catch块以执行存储过程:

exec [dbo].[exec_sp_with_try_catch] @pnvcSPName = '[dbo].[another_sp]'; 

但是,上述方法只适用于我们不使用[dbo].[another_sp]中的任何参数。

如果我们使用[dbo].[another_sp]参数:

exec [dbo].[exec_sp_with_try_catch] @pnvcSPName = '[dbo].[another_sp] @para = ''K'''; 

它引发以下错误:

Msg 50000, Level 16, State 2, Procedure exec_sp_with_try_catch, Line 30
The name '[dbo].[another_sp] @para = 'K'' is not a valid identifier.

为什么,以及如何纠正呢?

回答

0

试试这个:

CREATE PROCEDURE [dbo].[exec_sp_with_try_catch] 
@pnvcSPName NVARCHAR(100) , 
@para NVARCHAR(100) 
AS 
DECLARE @ErrorMessage NVARCHAR(4000); 
DECLARE @ErrorSeverity INT; 
DECLARE @ErrorState INT; 
BEGIN 

    BEGIN TRY 
     exec @pnvcSPName @para; 
    END TRY 
    BEGIN CATCH 
     SELECT @ErrorMessage = ERROR_MESSAGE(), 
       @ErrorSeverity = ERROR_SEVERITY(), 
       @ErrorState = ERROR_STATE(); 

     RAISERROR(@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
     ); 

     IF XACT_STATE() <> 0 
      ROLLBACK TRANSACTION; 
    END CATCH 

END; 

exec dbo.exec_sp_with_try_catch '[dbo].[another_sp]','K'; 
+0

它的工作原理。谢谢。 –

0

做这样的

CREATE PROCEDURE [dbo].[exec_sp_with_try_catch] (@pnvcSPName NVARCHAR(100)) 
AS 
DECLARE @ErrorMessage NVARCHAR(4000); 
DECLARE @ErrorSeverity INT; 
DECLARE @ErrorState INT; 
BEGIN 

    BEGIN TRY 
     EXEC sys.sp_executesql @pnvcSPName; --pay attention on possible need of escaping ' char here 
    END TRY 
    BEGIN CATCH 
     SELECT @ErrorMessage = ERROR_MESSAGE(), 
       @ErrorSeverity = ERROR_SEVERITY(), 
       @ErrorState = ERROR_STATE(); 

     RAISERROR(@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
     ); 

     IF XACT_STATE() <> 0 
      ROLLBACK TRANSACTION; 
    END CATCH 

END;