【问题标题】:Executing Stored Procedure via sp_executesql通过 sp_executesql 执行存储过程
【发布时间】:2009-01-20 17:42:43
【问题描述】:

我正在尝试在另一个存储过程中执行一个存储过程。问题是存储过程名称是在第一个过程中动态构建的。这是我正在尝试做的一个例子......

CREATE PROCEDURE SPINSVALUE_12345
    @guid uniqueidentifier
AS
    DECLARE @returnValue bit
    DECLARE @spToExec NVARCHAR(255)
    SET @returnValue = 0
    WHILE (@returnValue=0)
    BEGIN
         SET @spToExec = 'SPINSVALUE_' + REPLACE(@guid, '-', '_')
         ... DO OTHER STUFF ...
         EXEC sp_executeSQL @spToExec, N'@returnValue BIT OUTPUT', @returnValue OUTPUT
    END
END

我似乎无法让 sp_executeSQL 工作。是否可以通过这种方式执行存储过程并从 OUTPUT 参数中获取值?

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    proc 有返回值还是输出值? 这是一个例子

    create proc prBlatest
    as
    return 5
    go
    
    
    DECLARE @chvTableName VARCHAR(100),
    @intTableCount INT,
    @chvSQL NVARCHAR(100)
    
    SELECT @chvTableName = 'prBlatest'
    SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName
    
    EXEC sp_executesql @chvSQL, N'@intTableCount INT OUTPUT', @intTableCount OUTPUT
    
    SELECT @intTableCount
    GO
    

    顺便说一句,我认为有很多 proc 做类似的事情是个坏主意,也许你需要重构

    【讨论】:

    • 不幸的是,存储过程需要 2 个参数......一个输入和一个输出......当我在语句中添加它时不再起作用
    • 我意识到这很古老,但我遇到了同样的问题,我无法通过谷歌找到太多帮助。万一其他人偶然发现了这篇文章,这就是我的诀窍...确保将参数列表添加到 SQL 字符串以及 sp_executesql 调用中。所以在上面你会想在' + @chvTableName'之后附加+ ' @intTableCount = @intTableCount'
    【解决方案2】:

    抱歉耽搁了:D,以下代码完美运行(对于 N.. 输出和输入参数)请试试这个(source):

    CREATE PROCEDURE Myproc
    @parm varchar(10),
    
    @parm1OUT varchar(30) OUTPUT,
    @parm2OUT varchar(30) OUTPUT
    AS
    SELECT @parm1OUT='parm 1' + @parm
    SELECT @parm2OUT='parm 2' + @parm
    GO
    DECLARE @SQLString NVARCHAR(500)
    DECLARE @ParmDefinition NVARCHAR(500)
    DECLARE @parmIN VARCHAR(10)
    DECLARE @parmRET1 VARCHAR(30)
    DECLARE @parmRET2 VARCHAR(30)
    SET @parmIN=' returned'
    SET @SQLString=N'EXEC Myproc @parm,
    @parm1OUT OUTPUT, @parm2OUT OUTPUT'
    SET @ParmDefinition=N'@parm varchar(10),
    @parm1OUT varchar(30) OUTPUT,
    @parm2OUT varchar(30) OUTPUT'
    
    EXECUTE sp_executesql
    @SQLString,
    @ParmDefinition,
    @parm=@parmIN,
    @parm1OUT=@parmRET1 OUTPUT,@parm2OUT=@parmRET2 OUTPUT
    
    SELECT @parmRET1 AS "parameter 1", @parmRET2 AS "parameter 2"
    go
    drop procedure Myproc
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SET @spToExec = 'EXEC SPINSVALUE' + REPLACE(@guid, '-', '_') + ' @returnValue OUT'        
      EXEC sp_executeSQL @spToExec, N'@returnValue int OUTPUT', @returnValue OUTPUT
      

      【讨论】:

        【解决方案4】:

        我想补充一下 SQLMenace 的答案。他的回答帮助我朝着正确的方向前进。如果过程需要参数,则必须在语句参数中声明它们。

        create proc prBlatest @in int
        as
        return 5 + @in
        go
        
        DECLARE @chvTableName VARCHAR(100),
            @intTableCount INT,
            @chvSQL NVARCHAR(100)
        
        SELECT @chvTableName = 'prBlatest'
        SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName + ' @inputParam' 
                --NOTICE the @in parameter is declared in the statement parameter
        
        EXEC sp_executesql @chvSQL, N'@inputParam int, @intTableCount INT OUTPUT'
            , @inputParam = 5
            , @intTableCount = @intTableCount OUTPUT
        
        SELECT @intTableCount
        GO
        

        在这种情况下返回值 10。

        参数可以使用它们的名称来设置(使用来自@params 列表的名称)以避免在有很多时混淆。

        【讨论】:

          【解决方案5】:
          DECLARE @SQL NVARCHAR(100)
          DECLARE @return_value int 
          SET @SQL = '[dbo].[SpData] @id = 1' 
          EXECUTE sp_executesql @SQL ,N'@return_value INT OUTPUT', @return_value OUTPUT"
          

          【讨论】:

            【解决方案6】:

            非常好用,我用这个部件重建了一些部件。希望对某些人有所帮助;

            CREATE PROCEDURE Myproc
            AS
            GO
                DECLARE @ProcName  VARCHAR(255) = 'Procedure-Name'
                DECLARE @SQLString NVARCHAR(500)
                DECLARE @ParmDefinition NVARCHAR(500)
                DECLARE @parmIN VARCHAR(10)
                DECLARE @parmRET1 INT
                DECLARE @v_file_prefix varchar(255) = @ProcName
                DECLARE @v_file_identifier varchar(255) = '004faae0-5927-43f0-a3fb-aa24fcdbbef3'
                DECLARE @v_path varchar(255) = 'C:\INPUT\DataTransfer\Customers\Upload'
            
                BEGIN 
                    --SET @parmIN=' returned'
                    SET @SQLString=N'EXEC [src].[Load' + @ProcName + '] @p_file_prefix, @p_file_identifier, @p_path, @RowCount OUTPUT'
                    SET @ParmDefinition=N'@p_file_prefix varchar(255), @p_file_identifier varchar(255),@p_path varchar(255),@RowCount INT OUTPUT'
                    
                    EXECUTE sp_executesql
                    @SQLString,
                    @ParmDefinition,
                    @p_file_prefix=@v_file_prefix,
                    @p_file_identifier=@v_file_identifier,
                    @p_path=@v_path,
                    @RowCount=@parmRET1 OUTPUT
                END;
            
            SELECT @parmRET1 AS "parameter 1"
            go
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-14
              • 1970-01-01
              • 1970-01-01
              • 2011-09-24
              • 1970-01-01
              • 1970-01-01
              • 2010-09-15
              • 2012-11-01
              相关资源
              最近更新 更多