【问题标题】:How to pass output parameter to a Stored Procedure?如何将输出参数传递给存储过程?
【发布时间】:2014-01-30 06:22:47
【问题描述】:

我写了一个存储过程,格式如下:

ALTER PROCEDURE usp_data_migration 
   (@sourceDatabase varchar(50),
    @sourceTable varchar(50),
    @targetDatabase varchar(50),
    @targetTable varchar(50),
    @finaloutput varchar(max) output)
AS
BEGIN
----Set of SQL Blocks


END

然后,我正在执行程序:

DECLARE @finaloutput1 varchar(300)

EXEC usp_data_migration 'Yousuf', 'emp', '[City Branch]', 'emp_tgt', @finaloutput1 output 

SELECT @finaloutput1 

通过这种方式执行我没有正确的输出。

当我这样执行时:

DECLARE @finaloutput1 varchar(300)

EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase = '[City Branch]',
                        @targetTable = 'emp_tgt',
                        @finaloutput1 output 

SELECT @finaloutput1 

我收到一条错误消息:

消息 119,第 15 级,状态 1,第 41 行
必须将参数号 5 和后续参数作为“@name = value”传递。使用“@name = value”形式后,所有后续参数必须以“@name = value”形式传递。

如果我删除了我的输出参数并执行该过程,我会得到我想要的输出,但我无法将我的结果作为输出。

EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase = '[City Branch]',
                        @targetTable = 'emp_tgt'

我该怎么办?

提前致谢。

【问题讨论】:

    标签: sql-server tsql stored-procedures output output-parameter


    【解决方案1】:

    错误消息是不言自明的 - 您应该命名所有参数。

    DECLARE @finaloutput1 varchar(300);
    
    EXEC dbo.usp_data_migration -- always use schema prefix
      @sourceDatabase = 'Yousuf',
      @sourceTable = 'emp',
      @targetDatabase = '[City Branch]',
      @targetTable = 'emp_tgt',
      @finaloutput = @finaloutput1 OUTPUT;
    
    SELECT @finaloutput1;
    

    【讨论】:

      【解决方案2】:

      你必须像这样选择

      示例 1

        create procedure p1
          (
          @id INT,
          @name varchar(20) OUTPUT,
          @company varchar(20) OUTPUT
          )
          AS
           BEGIN
          Set @name = 'name'
          Set @company = 'company'
              select @name , @company from table1 where id = @id;
           END
          GO
      

      示例 2

      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
      

      Please refer more here

      【讨论】:

        【解决方案3】:

        简单示例:

        create procedure proc2 @var int out,@var2 varchar(10) out  
        as  
        begin  
        set @var=(select max(id) from customer);  
        set @var2=(select name from customer where id=@var);  
        end
        
        declare @maxid int;  
        declare @maxname varchar(10);  
        exec proc2 @maxid out,@maxname out;  
        select @maxid,@maxname;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          相关资源
          最近更新 更多