日期:2014-05-17  浏览次数:20519 次

存储过程下临时表多次使用 对象名无效 有好招?
SQL2008下建立如下存储过程,总是有提示 对象名无效:
@StockBill_ID 是参数 

Select b.StockBillDetail_MaterialID AS S_MaterialID,
a.StockBill_WarehouseID AS S_WarehouseID,
    SUM(b.StockBillDetail_Qty) AS S_Qty
    into   #tmpStockOpening   
    from   w_StockBill a,w_StockBillDetail b   
    where   a.StockBill_ID=b.StockBillDetail_ParentID AND b.StockBillDetail_Status =0 
    and  a.StockBill_ID= @StockBill_ID and a.StockBill_Status = 0
    group   by  b.StockBillDetail_MaterialID,a.StockBill_WarehouseID;
    
    --Inventory库存处理
    --更新已经存在的 
 update   c   set  c.Inventory_Qty = c.Inventory_Qty+S_Qty 
from   w_Inventory  c,#tmpStockOpening  
where   c.Inventory_MaterialID = S_MaterialID 
and c.Inventory_WarehouseID = S_WarehouseID ;    
--插入不存在的   
insert   w_Inventory(Inventory_MaterialID,Inventory_FromID,
Inventory_WarehouseID,Inventory_Qty)   
select   S_MaterialID,S_FromID,S_WarehouseID,S_Qty    
from   #tmpStockOpening  
where   not   exists(   
select   *   from   w_Inventory   
where   Inventory_MaterialID = S_MaterialID 
        and Inventory_WarehouseID = S_WarehouseID
); 

这样依次执行的 是否运行结果会有问题??

网上查到 :
DECLARE @Sql1 varchar(8000),@Sql2 varchar(8000),@Sql3 varchar(8000)

SET @Sql1 = '......' --上面对应第一个SQL执行语句
SET @Sql2 = '......'
SET @Sql3 = '......'
EXEC(@Sql1+@Sql2+@Sql3);

这是可行好方法吗?

------解决方案--------------------
那样执行可以啊,没必要写成exec(@sql)来执行,exec来执行,一般是用来执行动态拼接语句的
------解决方案--------------------
搞不懂了,为什么用写成string,然后再exec呢? 你直接在存储过程中运行好了.
------解决方案--------------------
楼主请注意一点
假如你的运行代码的会话,叫做会话1,那么创建的临时表只能存在会话1里

就算exec的命令也在会话1中运行,但实际exec内部会产生会话2去运行exec中包含的语句。

也就是说会话2中不会存在会话1的临时表,替换方法可以采用全局临时表##表名,局部临时表是#表名,或者将局部临时表#表替换成物理表即可