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写错,写的代码,如果太多,就退出循环,高人们帮忙看一下,是不是这样子写呢,
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写错,写的代码,如果太多,就退出循环,高人们帮忙看一下,是不是这样子写呢,
解决方案 »
- 表中同类记录只需要最新的记录怎么写?
- SQL语句如何求个月份的和或差
- [求教]初学习数据库,看什么书好?
- 请教无法删除强制订阅的问题,在线等!
- 如何估算数据库的大小,里面有int、varchar、image和text字段
- 怎么才能把数据库里面重复的信息删掉?从来没这样想过,竟然会碰到这样的情况
- sql7.0有个人版吗?
- 求一数据汇总SQL!请高手帮忙!在线急等!
- 大力在吗?帮我看看!!各位也来帮我看看,一个小问题!!
- 什么叫主域控制器(PDC)和备份域控制器(BDC),这是window2000中的概念吗?
- freetds调用sqlserver存储过程的问题
- SQL语句操作Excel插入一行数据,到65536行时就不能插入
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
{ sql_statement | statement_block
if @Level>10
return
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
begin .... end
高人们啊,你的意思是不是
if @Level>15
return
写在begin .... end 里面呢
if @Level>15
return下面的都是循环体外的,return就是结束过程,结束循环用的是break,结束当次循环是continue