存储过程作业
    set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go 
-- 商品出货
-- 返回: -1  数据 overflow
ALTER PROCEDURE [dbo].[ap_PopPro]
 @pro_id  int, --产品ID
 @wh_id  int, --仓库号
 @num  int     --出库数量
AS
BEGIN
 declare
  @pos1  int, --起始位置
  @pos2  int, --可放位置
  @curPos  int, --当前位置
  @totNum  int, --总的数量
  @curNum  int , --当前位置的数量
  @curtotNum  int, --当前商品总数量
  @totPrice money,  --总的出货价
  @curPrice money   --当前批的出货价
 declare
  @sqlCmd  nvarchar(200),
  @fldNum  varchar(10),
  @fldPrice varchar(10)
 --初始化出货总价
    set @totPrice = 0  
 --查找对应产品的记录
 select @pos1 = pos1, @pos2 = pos2, @totNum = totNum
  from whproduct
  where pro_id = @pro_id and wh_id = @wh_id    
 if  @totNum < @num   --产品数量不够,刚退出
 begin
  print 'The number of the product is not enough'
  return -1
 end
laber1:
    set @fldNum = 'num' + Convert(varchar(2), @pos1)  --得到当前num字段
 set @fldPrice = 'price' + Convert(varchar(2), @pos1)
 set @sqlCmd = 'select ' + '@curNum ='+ @fldNum+ ' ,@curtotNum = totNum'
 + ',@curPrice='+@fldPrice +' from whproduct where pro_id = @pro_id and wh_id = @wh_id' 
 exec   sp_executesql   @sqlCmd,N'@curNum int output ,@curtotNum int output, @curPrice money output ,@pro_id int,@wh_id int',@curNum output ,@curtotNum output,@curPrice output,@pro_id,@wh_id 
 set @curPos = @pos1  --一开始的初始化curPos 与@pos1相等,用于后面价格是否需要置0做准备
 if @curNum >=@num  --当前位置的商品数量大于或等于要求的数量时
 begin
  set @curNum = @curNum - @num
  set @curtotNum = @curtotNum - @num
  set @totPrice = @totPrice + @curPrice*@num
  set @num = 0  --取出数量全总,所以设为0   
  if @curNum = 0
   begin
    set @pos1 = @pos1 +1
   end
 end 
 else    --当前位置的商品数量小于要求的数量时
  begin
   set @num = @num - @curNum
   set @totPrice = @totPrice + @curPrice*@curNum
   set @curtotNum = @curtotNum - @curNum
   set @curNum = 0
   set @pos1 = @pos1 + 1   
  end
  if @curPos != @pos1  --当发现当前位置的商品都被取光的时候,该位置的进货价格清0
   begin 
    set @fldPrice = 'price' + Convert(varchar(2), @curPos)
    set @sqlCmd = 'update whProduct set ' + @fldprice + ' = ' + Convert(varchar(10), 0)
    +' where  pro_id = @pro_id and wh_id = @wh_id'
    exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id
   end  
  if @pos1 = @pos2   --当位置1到达位置2时,也就相当于仓库里面没货了,这时应该把@pos1返回
  begin
   set @pos1 = 1
   set @pos2 = 1
  end
  --当前位置被置0后,修改数据表中的值  
  set @sqlCmd = 'update whProduct set pos1 = ' + Convert(varchar(2), @pos1) + ',pos2 = ' + Convert(varchar(2), @pos2) +', totNum =  '
   + Convert(varchar(5), @curtotNum)  +  ',' + @fldNum +'='+ Convert(varchar(5), @curNum)+
  ' where  pro_id = @pro_id and wh_id = @wh_id'
  exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id         
  if @num != 0
  begin
   goto laber1  --如果需要的商品数量还没有得到,则回到前面部分,进而得到循环的目的
  end  
  print '出货成功--'
  print '出货数量为:' 
  print @totN