如何使用多个输出参数执行存储过程?

时间:2014-03-10 18:59:13

标签: sql sql-server stored-procedures

我有一个带有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'  

1 个答案:

答案 0 :(得分:0)

在评论部分中进行了这个小聊天之后,这一切都归结为从过程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......