创建存储过程了一存储过程A,在其中建一临时表#temp,并且在存储过程A中要调用存储过程B,问
在B中能否直接用#temp中已有的数据?

解决方案 »

  1.   

    可以。create proc _sp2
    as
    update #temp set id=id*10
    go
    create proc _sp1
    ascreate table #temp (id int)insert into #temp select 1print '_sp1中:执行_sp2前'
    select * from #tempexec _sp2print '_sp1中:执行_sp2后'
    select * from #tempGO
    exec _sp1
    drop proc _sp1,_sp2
      

  2.   

    ## 表是“全局”表,不管是在哪里声明的。其生命期延长到声明它们的会话退出,或明确丢弃它们。如果其他用户正在引用全局表(例如,当创建者退出后,其他用户正在对该表执行选择操作),那么,将等到引用该表的用户完成对它的处理之后(完成 SELECT 或 UPDATE 后),才会丢弃该表。 # 表与局部变量类似。它们仅可见于声明作用域和所有从属作用域。当声明块超出作用域时,这些表的生命期才会终止。如果您已在级别 0 创建表,并在级别 1 使用 EXEC(“select ...”)引用该表,那么,由于局部临时表是在级别 0 声明的,所以,该表将一直存在,直到被明确丢弃或会话退出(这种情况下,表将被丢弃)。 
      

  3.   

    wangtiecheng(不知不为过,不学就是错!) 你建的两个存储过程中加上begin。end再试试解释就是上面的回复
      

  4.   

    没有问题。create proc _sp2
    as
    begin
            update #temp set id=id*10
    end
    gocreate proc _sp1
    as
    begin
            create table #temp (id int)        insert into #temp select 1        print '_sp1中:执行_sp2前'
            select * from #temp        exec _sp2        print '_sp1中:执行_sp2后'
            select * from #temp
    end
    GO
    exec _sp1
    drop proc _sp1,_sp2
      

  5.   

    "临时表将在退出其作用域时由系统自动除去"a在b里执行,那么b中建立的临时表作用域应该在a内都有效?
      

  6.   

    太感谢各位了,尤其是splory(爽儿)和wangtiecheng(不知不为过,不学就是错!) 我再把问题问详细一些,再麻烦一下各位大虾。
    创建了一存储过程A,在其中建一临时表#temp,有四个字段a,b,c,d,在存储过程A中已经把前三个字段a,b,c更新完,第四个字段d需要用前三个字段做复杂计算才能得到,考虑到可能还要进行插入操作,就单独建立了一存储过程B进行处理字段d,问对于#temp中已有数据只能利用游标一行一行处理吗?
      

  7.   

    创建了一存储过程A,在其中建一临时表#temp,有四个字段a,b,c,d,在存储过程A中已经把前三个字段a,b,c更新完,第四个字段d需要用前三个字段做复杂计算才能得到,考虑到可能还要进行插入操作,就单独建立了一存储过程B进行处理字段d,问对于#temp中已有数据只能利用游标一行一行处理吗?
    方法很多:看情况而定,可能的方法:动态查询、游标、循环等等
    看个人的能力和SQL查询效率而定