我写了个存储过程如下:
create procedure proc_fjzdbh   
 @fhbh int,
 @fhhh int,
 @UserId varchar(8),
 @fjck Decimal(12,3),
 @fjsl Decimal(12,3),
 @spbh  int,  
 @LessonId  int 
as
 declare @dbbh int,
         @bh int,
         @qhhw int,
         @zybh int,
         @ck decimal(12,3),
         @maxck decimal(12,3),
         @cntck decimal(12,3),
         @dbsl decimal(12,3),
         @count1  int ,
         @txm varchar(13)
       
begin 
     set @ck=@fjsl-@fjck
     set @cntck=0.000
     set @maxck=(select sum(Isnull(c.spsl,0)) from  DRPT_Psck_Hwxx  a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c  where   a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
               a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh)
if(@maxck<@ck)
return 
 else
begin     create  table ##tba(bh int,spsl decimal(12,3) ,bz char(1))
     insert into ##tba(bh,spsl,bz)  select b.bh,spsl,'0' from  DRPT_Psck_Hwxx a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c  where   a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
               a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh --这句执行不了
     while @cntck<@ck
        begin 
        set @dbbh = (select  top 1  bh  from ##tba a  where  abs( @cntck-a.spsl)=(select min(abs(@cntck-a.spsl)) from ##tba where bz='0' ) and a.bz='0')
        set @dbsl= (select Isnull(spsl,0)  from ##tba   where bh=@dbbh)
        set @cntck=@cntck+@dbsl
        select @qhhw=b.bh,@txm=Bztxm  from  DRPT_Psjh_Dbxx a, DRPT_Psck_Hwxx b  where a.bh=b.dbbh and  a.bh=@dbbh
        set @count1=(select count(*) from  DRPT_Pschq_Zylb)
        if @count1=0
         set @bh=1
        else
         set @bh =(select max(bh)+1  from  DRPT_Pschq_Zylb)
        insert into  DRPT_Pschq_Zylb(bh,UserId,LessonId,Txm,Zlzt,Zllx,Qhhw,Fhhw,Scsj,Djzb,Djcb,Knzy,Qybh,bz)
                values (@bh,@UserId,@LessonId,@Txm,'未执行','出库',@qhhw,'-1',getdate(),@fhbh,@fhhh,'1',@dbbh,'自动生成配送补货出库')
         update  ##tba  set bz='1' where bh=@dbbh
      end 
      drop table ##tba 
   end
end

解决方案 »

  1.   

    select b.bh,spsl,'0' 
    from  DRPT_Psck_Hwxx a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c 
     where   a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
                   a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  
    and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh
    这一句有结果集???
      

  2.   

    没看到你问什么问题?如果是从临时表里面取不到数据?请注意本地临时表仅在当前会话中可见.全局临时表在所有会话中都可见。临时表
    可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
    INSERT INTO #MyTempTable VALUES (1)如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去: 当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
    所有其它本地临时表在当前会话结束时自动除去。
    全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。 
    在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:CREATE PROCEDURE Test2
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (2)
    SELECT Test2Col = x FROM #t
    GO
    CREATE PROCEDURE Test1
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (1)
    SELECT Test1Col = x FROM #t
    EXEC Test2
    GO
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (99)
    GO
    EXEC Test1
    GO下面是结果集:(1 row(s) affected)Test1Col    
    ----------- 
    1           (1 row(s) affected)Test2Col    
    ----------- 
    2           当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。
    建议你使用临时使用的表,用完后删除,用之前如果存在则先删除之,不要用临时表.
      

  3.   


        create  table ##tba(bh int,spsl decimal(12,3) ,bz char(1))
         insert into ##tba(bh,spsl,bz)  select b.bh,spsl,'0' from  DRPT_Psck_Hwxx a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c  where   a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
                   a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh --这句执行不了
     
    直接  select b.bh,spsl,'0' as bz
    from  DRPT_Psck_Hwxx a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c 
    into ##tba
    where  a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
                  a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  
    and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh 
      

  4.   


    没有看出使用全局临时表的必要,建议把全局临时表换成本地临时表,
    select b.bh,spsl,'0' as bz
    from  DRPT_Psck_Hwxx a ,DRPT_Pschq_hwfp b ,DRPT_Psjh_Dbxx c 
    into #tba
    where  a.sfsd='无锁定' and a.ywsp='1' and  Isnull(c.spsl,0)>0 and a.pdsd='0' and 
                  a.bh= b.hwbh  and a.Dbbh=c.bh and a.UserId=@UserId  
    and c.bh not in (select qybh from DRPT_Pschq_Zylb where UserId=@UserId  and knzy='1') and c.spbh=@spbh