首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于存储过程的部分不太理解

2013-01-23 
关于存储过程的一部分不太理解CREATE Procedure P_RM_RepairSparepartsBillDetail_Add@OperatorPointCodeV

关于存储过程的一部分不太理解
CREATE Procedure P_RM_RepairSparepartsBillDetail_Add
@OperatorPointCode  VARCHAR(32)= NULL,-- 操作者所在网点号
@PointCodevarchar(32)=null,
    @YesNOFreezeint   =null,  
@RepairBillCodevarchar(32)=null,
@SerialNoint=null,
@RepairJobSerialNovarchar(32)=null,
@SparepartIDvarchar(32)=null,
@SparepartCodevarchar(32)=null,
@SparepartNamevarchar(128)=null,
@PlanCompleteTimeDATETIME=NULL,
@StorageCodevarchar(32)=null,
@Unitvarchar(32)=null,
@SalePricedecimal(12,2)=null,
@RequireAmountdecimal(12,2)=null,
@FreezeAmountdecimal(12,2)=null,
@RepairTypeVARCHAR(32)=null,
@Discountdecimal(12,2)=null,
@FeeTypevarchar(32)=NULL,
@OperatorCodevarchar(32),
@Factoryprice       decimal(12,2)=null,
@RepairJobTypevarchar(32),
@AddFlagint =0

AS
BEGIN
DECLARE @StoreNumdecimal(12,2)--库存数量
DECLARE @LackAmountdecimal(12,2)--记录当前冻结数量
    DECLARE @FactoryPayINT--厂家付费标志
DECLARE @FeeFlagINT--记录是否客户付费标记
IF @PointCode IS NULL OR @PointCode=''
SET @PointCode=@OperatorPointCode
--查询厂家付费、客户付费标志,如本网点没有此费用类别,则用上级网点数据
;WITH Args AS 
(
SELECT 1 AS OrderID , b.pointcode,b.parentpointcode
FROM T_PointInfo B WITH(NOLOCK)
WHERE  B.PointCode = @PointCode

UNION ALL 
SELECT b.OrderID + 1 AS OrderID , a.pointcode,a.parentpointcode
FROM T_PointInfo A  WITH(NOLOCK) ,Args B 
WHERE a.PointCode = B.parentpointcode 
)
SELECT TOP 1 @FactoryPay = ISNULL(A.factoryflag,0),@FeeFlag  = ISNULL(A.FeeFlag , 1) 
FROM T_SparepartsFeeType A  WITH(NOLOCK), Args B  WITH(NOLOCK)
WHERE  a.PointCode = B.PointCode AND  A.feetype =@FeeType
ORDER BY b.Orderid desc

IF @SerialNo IS NULL --新增模式
BEGIN
SELECT @SerialNo = ISNULL(MAX(SerialNo),0)+1 FROM T_RepairSparepartsBill
END
IF @YesNOFreeze = 1
BEGIN
--更新备件库存表
UPDATE T_SparepartsInventory
SET
FreezeAmount = @FreezeAmount + FreezeAmount
WHERE PointCode = @PointCodeAND SparepartsID = @SparepartID
-- 若异常不为零 返回-1,更新失败
IF @@ERROR <> 0                
RETURN 70110501 
END 
ELSE
BEGIN
SET @FreezeAmount = 0 
END
INSERT INTO T_RepairSparepartsBill
(PointCode,RepairBillCode,RepairJobSerialNo,SerialNo,SparepartID,SparepartCode,SparepartName,StorageCode,
Unit,SalePrice,RequireAmount,Discount,FeeType,FeeFlag,DataSource,OutAmount,FreezeAmount,RepairType,RepairJobType,FactoryPay,Factoryprice,AddFlag)
VALUES(@PointCode,@RepairBillCode,@RepairJobSerialNo,@SerialNo,@SparepartID,@SparepartCode,@SparepartName,@StorageCode,
@Unit,@SalePrice,@RequireAmount,@Discount,@FeeType,@FeeFlag,'维修备件',0,@FreezeAmount,@RepairType,@RepairJobType,@FactoryPay,@Factoryprice,@AddFlag)
-- 若异常不为零 返回-1,插入失败
IF @@ERROR <> 0                
RETURN 70110502



END 存储
[解决办法]
with那段是2005以后出现的叫做CTE的功能,可以直接在联机丛书上输入CTE就有相关的解释,这里主要实现while循环。而CTE的强项就在嵌套循环里面,你可以单独做个测试表,然后循环看看,先循环2条数据。再循环3条。这些只能你自己去体会了。说的你以后没有什么印象
[解决办法]

引用:
可以把这个看作临时表吗?
大部分情况下可以

热点排行
Bad Request.