DECLARE @Level int
SET @Level = 1
--循环增加
while @@rowcount > 0
--如果level超过了10,表示有问题,因为嵌套10的情况很少见,除非是出错了
if @Level>10
return
begin
SET @Level = @Level + 1 
--追加查询,把上一层性质是自制属性的,添加进去.(1+d.de3/100-d.de4/100) de3为增加损耗率,de4为扣除率
insert into #re(id,socode,cinvcode,intb,free1,free2,sta)
select a.id,a.socode,d.cinvcode,a.intb*d.de1/d.de2*(1+d.de3/100-d.de4/100) as     sumquan,b.free1,b.free2,sta=@Level
from #re a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
left join ainventory b on d.cinvcode=b.cinvcode
where a.sta = @Level-1 and a.free1 = 1
end
 上面有一句
if @Level>10
return  是防止BOM写错,写的代码,如果太多,就退出循环,高人们帮忙看一下,是不是这样子写呢,

解决方案 »

  1.   

    设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 Transact-SQL 语法约定语法
     
    WHILE Boolean_expression 
         { sql_statement | statement_block } 
         [ BREAK ] 
         { sql_statement | statement_block } 
         [ CONTINUE ] 
         { sql_statement | statement_block 
     
      

  2.   

    return 不能用吗,其实我的目的不是退出循环,而是整个的退出,中断整个存储过程.
      

  3.   

    怎么写呢, 是不是就是
    if @Level>10
    return 
      

  4.   

    BOM用递归可以真正的拆到底,万一不止10层,你的结果就不对了
      

  5.   

    超过10层真的是太少了,BOM做10层,在我们这种企业不太可能
      

  6.   

    这个是可以根据自己的需求来定,如果有设定,设置50或100都没关系,跟你设置10差处理起来差别不大,况且这种情况不是很多。SQL最怕的是死循环。
      

  7.   

    真他妈的气人呀,我找不出来原因,我完整的存储过程如下写法ALTER procedure [dbo].[brpbom] (@socode1 varchar(20),@socode2 varchar(20))
    as 
    --第一步建立一个临时表#re,如果已经存在,就删除,重新建
    if object_id('tempdb.dbo.#re') is not null
    drop table #re
    CREATE TABLE #re
    (id int NULL,
    socode varchar(50) NULL,
    cinvcode varchar(50) NULL,
    intb [decimal](18, 4) NULL,
    free1 bit NULL,
    free2 bit NULL,
    sta int NULL)
    -- 第二步 定义一个变量
    DECLARE @Level int
    SET @Level = 1
    --第三步,追加查询把订单资料追加到临时表
    insert into #re(a.id,a.socode,a.cinvcode,a.intb,b.free1,b.free2,sta)
    select a.id,a.socode,a.cinvcode,a.intb,b.free1,b.free2,sta=@level 
    from dsaleson a left join ainventory b on a.cinvcode=b.cinvcode where a.socode between @socode1 and @socode2
    --循环增加
    while @@rowcount > 0
    --如果level超过了10,表示有问题,因为嵌套15的情况很少见,除非是出错了
    if @Level>15
    return
    begin
    SET @Level = @Level + 1 
    --追加查询,把上一层性质是自制属性的,添加进去.(1+d.de3/100-d.de4/100) de3为增加损耗率,de4为扣除率
    insert into #re(id,socode,cinvcode,intb,free1,free2,sta)
    select a.id,a.socode,d.cinvcode,a.intb*d.de1/d.de2*(1+d.de3/100-d.de4/100) as sumquan,b.free1,b.free2,sta=@Level
    from #re a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
    left join ainventory b on d.cinvcode=b.cinvcode
    where a.sta = @Level-1 and a.free1 = 1
    end
    --第四步,添加到永久表cbrp中
    insert into cbrp(id,socode,cinvcode,intb,free1,free2,sta)
    select id,socode,cinvcode,intb,free1,free2,sta from #re
    --第五步,有的时间出现NULL,不知道为什么会这样子,以后找到原因会删掉这一条
    delete cbrp where cinvcode is null
    --第六步,得到BRP运算结果
    select count(0) from cbrp where socode between @socode1 and @socode2
    问题现在奇怪了,以下这一句上加上,就只循环一次, 第二次BOM就不循环了,也不退出整个存储过程,弄得出来的数据是少了一层的,哎,
    --如果level超过了10,表示有问题,因为嵌套15的情况很少见,除非是出错了
    if @Level>15
    return
      

  8.   

    while @@rowcount > 0
    begin .... end
      

  9.   


    高人们啊,你的意思是不是
    if @Level>15
    return
    写在begin .... end 里面呢
      

  10.   

    还有 为什么 return 只能退出循环,而不是中断整个程序呢,我需要的是立即停止这个存储过程,又该如何写呢
      

  11.   

    确切的说不加begin end 你的循环体内只是有这么个东西 
    if @Level>15
    return
    下面的都是循环体外的,return就是结束过程,结束循环用的是break,结束当次循环是continue
      

  12.   

    那我就把 if @Level>15  return 写在begin .... end 里面好啦,看能不能达到我想要的效果.