关于存储过程的一部分不太理解
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条。这些只能你自己去体会了。说的你以后没有什么印象
[解决办法]