儲存過程作業

2021-08-25 06:21:36 字數 3124 閱讀 8177

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 --出庫數量

asbegin

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

endlaber1:

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

endend

else --當前位置的商品數量小於要求的數量時

begin

set @num = @num - @curnum

set @totprice = @totprice + @curprice*@curnum

set @curtotnum = @curtotnum - @curnum

set @curnum = 0

set @pos1 = @pos1 + 1

endif @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

endif @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 --如果需要的商品數量還沒有得到,則回到前面部分,進而得到迴圈的目的

endprint '出貨成功--'

print '出貨數量為:'

print @totnum - @curtotnum

print '出貨總價為:'

print @totprice

end

建立作業的通用儲存過程

if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...

建立作業的通用儲存過程

if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...

建立作業的通用儲存過程

if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...