程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL一個存儲過程調用另一個存儲過程 獲得返回值問題

SQL一個存儲過程調用另一個存儲過程 獲得返回值問題

編輯:關於SqlServer


第一種方法: 使用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved