SQL一个存储过程调用另一个存储过程 获得返回值问题

第一种方法: 使用output参数

 

USE  AdventureWorks;
GO
IF   OBJECT_ID  (  ' Production.usp_GetList ' ' P '  )  IS   NOT   NULL  
    
DROP   PROCEDURE  Production.usp_GetList;
GO
CREATE   PROCEDURE  Production.usp_GetList  @product   varchar ( 40
    , 
@maxprice   money  
    , 
@compareprice   money  OUTPUT
    , 
@listprice   money  OUT
AS
    
SELECT  p.name  AS  Product, p.ListPrice  AS   ' List Price '
    
FROM  Production.Product p
    
JOIN  Production.ProductSubcategory s 
      
ON  p.ProductSubcategoryID  =  s.ProductSubcategoryID
    
WHERE  s.name  LIKE   @product   AND  p.ListPrice  <   @maxprice ;
--  Populate the output variable @listprice.
SET   @listprice   =  ( SELECT   MAX (p.ListPrice)
        
FROM  Production.Product p
        
JOIN   Production.ProductSubcategory s 
          
ON  p.ProductSubcategoryID  =  s.ProductSubcategoryID
        
WHERE  s.name  LIKE   @product   AND  p.ListPrice  <   @maxprice );
--  Populate the output variable @compareprice.
SET   @compareprice   =   @maxprice ;
GO

另一个存储过程调用的时候:

Create   Proc  Test
as
DECLARE   @compareprice   money @cost   money  
EXECUTE  Production.usp_GetList  ' %Bikes% ' 700
    
@compareprice  OUT, 
    
@cost  OUTPUT
IF   @cost   <=   @compareprice  
BEGIN
    
PRINT   ' These products can be purchased for less than 
    $
' + RTRIM ( CAST ( @compareprice   AS   varchar ( 20 ))) + ' . '
END
ELSE
    
PRINT   ' The prices for all products in this category exceed 
    $
' +   RTRIM ( CAST ( @compareprice   AS   varchar ( 20 ))) + ' . '

 

第二种方法:创建一个临时表

create   proc  GetUserName
as
begin
    
select   ' UserName '
end

Create   table  #tempTable (userName  nvarchar ( 50 ))
insert   into  #tempTable(userName)
exec  GetUserName

select  #tempTable

-- 用完之后要把临时表清空
drop   table  #tempTable

 

-- 需要注意的是,这种方法不能嵌套。例如:

  
procedure    a   
  
begin    
      ...   
      
insert    # table     exec    b   
  
end    
    
  
procedure    b   
  
begin    
      ...   
      
insert    # table      exec    c   
      
select     *     from    # table      
  
end    
    
  
procedure    c   
  
begin    
      ...   
      
select     *     from    sometable   
  
end    

-- 这里a调b的结果集,而b中也有这样的应用b调了c的结果集,这是不允许的,
--
会报“INSERT EXEC 语句不能嵌套”错误。在实际应用中要避免这类应用的发生。

 

第三种方法:声明一个变量,用exec(@sql)执行:

1);EXEC 执行SQL语句

 

declare   @rsql   varchar ( 250 )
        
declare   @csql   varchar ( 300 )
        
declare   @rc   nvarchar ( 500 )
        
declare   @cstucount   int
        
declare   @ccount   int
        
set   @rsql = ' (select Classroom_id from EA_RoomTime where zc= ' + @zc + '  and xq= ' + @xq + '  and T ' + @time + ' = '' '' ) and ClassroomType= '' 1 '''
        
-- exec(@rsql)
         set   @csql = ' select @a=sum(teststucount),@b=sum(classcount) from EA_ClassRoom where classroom_id in  '
        
set   @rc = @csql + @rsql
        
exec  sp_executesql  @rc ,N ' @a int output,@b int output ' , @cstucount  output, @ccount  output -- 将exec的结果放入变量中的做法
         -- select @csql+@rsql
         -- select @cstucount

 

2)EXEC 执行存储过程: 没有实验出来,如果有那位大侠知道,请赐教QQ:33574236

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值