【问题标题】:SQL Server 2012 - Pass stored procedure name to another stored procedureSQL Server 2012 - 将存储过程名称传递给另一个存储过程
【发布时间】:2017-08-17 14:54:27
【问题描述】:

我需要经常使用TRY..CATCH 块执行存储过程。 因此,我写了一个包含TRY..CATCH块+输入参数的存储过程:

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''';

它会抛出以下错误:

消息 50000,级别 16,状态 2,过程 exec_sp_with_try_catch,第 30 行
名称 '[dbo].[another_sp] @para = 'K'' 不是有效标识符。

为什么,以及如何纠正?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    试试这个:

    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';
    

    【讨论】:

      【解决方案2】:

      这样做

      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;
      

      【讨论】:

        猜你喜欢
        • 2013-08-29
        • 2015-08-20
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 2014-09-26
        相关资源
        最近更新 更多