【问题标题】:How do I execute a stored procedure with multiple output parameters?如何执行具有多个输出参数的存储过程?
【发布时间】:2014-03-10 18:59:12
【问题描述】:

我有一个带有 2 个输出参数的存储过程,并希望使用 SQL 执行它,但在将它们分配给存储过程的结果时无法获取这些值。

简而言之,我有一个存储过程,它可以获取具有两个输出参数的登录用户的公司。一个是整数错误代码,另一个是公司名称。存储过程还返回公司所有其他用户的结果。

由于所有用户都将拥有相同的公司名称,我不想用另一个字段来膨胀响应,并认为最好将公司名称分配给一个变量,但不能让它正常工作。

我执行存储过程的 SQL 是:

DECLARE @parmRET1 VARCHAR(30)
DECLARE @parmRET2 int

EXECUTE CRUD_User @pvchAction = 'select',    
                  @Id = '30862982-E189-4CE6-A299-5996D62DDCD5',
                  @pCompanyNameOut = @parmRET1 OUTPUT, 
                  @pIntErrDescOut = @parmRET2 OUTPUT

SELECT @parmRET1 AS [output parameter], @parmRET2 AS [output parameter]

我的存储过程代码是:

alter PROC [dbo].[CRUD_User]
(        
    @Id                 varchar(400)=null,  
    @Name               varchar(400)=null,  
    @Phone              varchar(200)=null,  
    @PriceNotes         varchar(max)=null,  
    @isActive           bit= 0,  
    @pvchAction         varchar(50)=null,        
    @pIntErrDescOut     int output,
    @pCompanyNameOut    varchar(200) output
    )        
AS        
    BEGIN        

    if(@pvchAction='select')        
         begin
                --EXEC    @pCompanyNameOut = dbo.sel_Company_by_UserId @Id OUTPUT

                SET @pIntErrDescOut = '3'; --works in getting output
                EXEC @pCompanyNameOut = sel_Company_by_UserId @Id --not working


                SELECT   *
                FROM   aspnet_Users u
                left outer join UserInfo ui on u.UserId = ui.userId 
                left outer join aspnet_Membership m on m.UserId = u.UserId 
                left outer join Company c on c.Id = ui.CompanyId 
                WHERE u.UserId = isnull(@Id, u.UserId)  ;

                RETURN 

         end
     .....

 IF (@@ERROR <> 0)         
          BEGIN         
                SET @pIntErrDescOut = 1      
          END        
     ELSE        
          BEGIN        
                SET @pIntErrDescOut = 0    
          END    

END

当从 sel_Company_by_UserId 中提取存储的 proc sql 时,一切正常:

SET @pCompanyNameOut = (select Name 
                        from Company C inner join UserInfo ui 
                        on C.Id = ui.CompanyId 
                      where ui.userId = '30862982-E189-4CE6-A299-5996D62DDCD5'  )

但是当我想让 proc 返回相同时失败:

"EXEC @pCompanyNameOut = sel_Company_by_UserId '30862982-E189-4CE6-A299-5996D62DDCD5'  

【问题讨论】:

  • 什么是sel_Company_by_UserId?一个函数?另一个存储过程?
  • 是的,它是 ms sql server,这是一个存储过程
  • @pCompanyNameOut sel_Company_by_UserId中的输出参数还是返回值?
  • 这个过程没有多大意义你当前的代码说检查@pvchAction='select'是否执行BEGIN..END块内的代码并返回。您的代码永远不会到达 @@ERROR 函数部分。此外,如果您在发生错误之后执行任何代码行,@@ERROR 会将其值重置为 null。
  • 我能够通过提供的代码执行 proc,它运行选择部分中的部分,但无法为 @pCompanyNameOut 提供值 - 我如何才能将 comapny 分配给此参数?

标签: sql sql-server stored-procedures


【解决方案1】:

在 cmets 部分进行了这个小讨论之后,这一切都归结为您从过程 sel_Company_by_UserId 的返回值,您不能从过程中返回除 INT 以外的任何其他数据类型。对于 INT 以外的数据类型,您需要使用 OUTPUT 参数。

看看下面的代码。

ALTER sel_Company_by_UserId
@Id GUID,
@NameVal VARCHAR(100) OUTPUT   --<-- add this param here with "OUTPUT" key word
AS
BEGIN
  SET NOCOUNT ON;

  select @NameVal   =  Name 
  from Company C inner join UserInfo ui 
  on C.Id = ui.CompanyId 
  where ui.userId = @Id
END

现在,一旦您更改了 sel_Company_by_UserId 存储过程中的逻辑, 现在在[dbo].[CRUD_User] 中进行相应更改。

有点像

  if(@pvchAction='select')        
         begin

            SET @pIntErrDescOut = '3'; --works in getting output
            EXECUTE sel_Company_by_UserId @id = @Id
                                        , @NameVal = @pCompanyNameOut OUTPUT 

   ..... rest of your code......

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多