当前位置:主页 > 技术专题 > 数据库 >

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

    2010-10-19 15:44 作者:admin 来源:admin 浏览次数:

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

    资料引用:http://www.knowsky.com/539476.html

联系方式 | 收费标准 | 上门服务 | 公司简介 | 汇款账户

回天时代有限公司

杭州公司: 杭州市文三路388号钱江科技大厦10楼1016室

华东总部:上海市徐汇区漕溪北路41号汇嘉大厦12楼E室(太平洋一期12楼)

咨询热线:400-889-1122(全国),0512-66099871(苏州),021-58358765(上海),0571-88218821(杭州) 24小时热线:13524645444,案:浙ICP备06024533号