【问题标题】:Allocating stock to a sales order using a cursor使用光标将库存分配给销售订单
【发布时间】:2021-12-21 09:57:47
【问题描述】:

我正在使用 MS SQL Server 2014。我正在尝试将库存分配给销售订单。销售订单可以有多行,并且库存代码可以重复。分配的库存对于每个发生都有唯一的参考。 我希望将股票逐行分配给股票代码,一旦分配完成,@allocation 临时表就会更新,因此当光标下一次运行时,它只会选择空闲股票,而分配的股票将被忽略。 我还没有添加这个元素,但是当我尝试按原样运行代码时,我收到以下错误

消息 208,级别 16,状态 1,第 67 行无效的对象名称“ctee”。

任何有关 cte 无效的原因的帮助都会非常感激。

我的代码如下所示。

IF OBJECT_ID('[dbo].[@allocation]') is not null
 DROP TABLE [dbo].[@allocation]
 declare @RESULT AS TABLE(COR_UNIQUE VARCHAR(20),COR_PART_ONLY varchar(16),COR_OUR_NUMBER  varchar(16),COR_QTY_ORDERED   decimal(18,5) );
 declare @allocation AS TABLE(L_U VARCHAR(20),C_U VARCHAR(20),L_PART varchar(16),L_PHY DECIMAL(18,5),R_T DECIMAL(18,5),ORD_RUN DECIMAL(18,5),T_L DECIMAL(18,5),FINAL_T_L DECIMAL(18,5));
DECLARE @COR_UNIQUE AS VARCHAR(20),@COR_PART_ONLY AS varchar(16),@COR_OUR_NUMBER  AS varchar(16),@COR_QTY_ORDERED as decimal(18,5);
DECLARE @L_U  AS VARCHAR(20),@C_U AS VARCHAR(20),@L_PART AS varchar(16),@L_PHY AS decimal(18,5),@R_T AS DECIMAL(18,5),@ORD_RUN AS DECIMAL(18,5),@T_L AS DECIMAL(18,5),@FINAL_T_L AS DECIMAL(18,5);

DECLARE cursor_results CURSOR FOR

with   ctea(COR_UNIQUE,COR_PART_ONLY,COR_OUR_NUMBER,COR_QTY_ORDERED)
  as
  (
 SELECT  [COR_UNIQUE]
      ,[COR_PART_ONLY]
      ,[COR_OUR_NUMBER]
      ,[COR_QTY_ORDERED]
     
  FROM [RMC_ASC_TEST].[dbo].[ASC_COR_TBL]
  where COR_OUR_NUMBER_N ='8215258'
  and [COR_UNIQUE] = '437145'
  )
  
 select COR_UNIQUE,COR_PART_ONLY,COR_OUR_NUMBER,COR_QTY_ORDERED
from ctea
--left join cte WITH (NOLOCK) ON LOT_PART_ONLY = COR_PART_ONLY
--where @COR_UNIQUE = COR_UNIQUE
 
OPEN cursor_results;
FETCH NEXT FROM cursor_results into @COR_UNIQUE,@COR_PART_ONLY,@COR_OUR_NUMBER,@COR_QTY_ORDERED  ;
WHILE @@FETCH_STATUS = 0
BEGIN 
WITH CTW(L_UN,F_T_L)
AS
(
SELECT L_U AS L_UN
      ,SUM( FINAL_T_L) AS F_T_L
       FROM @allocation
       GROUP BY L_U
),
 CTEB(LOT_UNIQUE_B,LOT_PART_ONLY_B,LOT_PHYSICAL_B,LOT_KIT_ALLOCATIONS_B,RUNNING_TOTAL_B)
  AS
  (SELECT LOT_UNIQUE,LOT_PART_ONLY,LOT_PHYSICAL- F_T_L AS LOT_PHYSICAL ,LOT_KIT_ALLOCATIONS,
sum(LOT_PHYSICAL) over (order by LOT_EXPIRY_DATE) AS RUNNING_TOTAL
FROM [dbo].[ASC_LOT_TBL]
LEFT JOIN CTW WITH (NOLOCK) ON L_UN =LOT_UNIQUE
 where LOT_PART_ONLY ='105165'
 ),
 CTEC(L_U,C_U,L_PART,L_PHY,R_T,ORD_RUN,T_L)
 AS
 (
SELECT LOT_UNIQUE_B AS L_U,@COR_UNIQUE as C_U,LOT_PART_ONLY_B AS L_PART,LOT_PHYSICAL_B AS L_PHY,RUNNING_TOTAL_B AS R_T, RUNNING_TOTAL_B-@COR_QTY_ORDERED AS ORD_RUN,
case
when RUNNING_TOTAL_B-@COR_QTY_ORDERED <=0 then LOT_PHYSICAL_B
WHEN RUNNING_TOTAL_B- LOT_PHYSICAL_B >= 0  AND LOT_PHYSICAL_B - (@COR_QTY_ORDERED-RUNNING_TOTAL_B) >= 0 THEN LOT_PHYSICAL_B -(RUNNING_TOTAL_B-@COR_QTY_ORDERED)


ELSE 0
end as T_L

 FROM CTEB
  left join @RESULT  ON @COR_PART_ONLY =LOT_PART_ONLY_B
  where LOT_PART_ONLY_B ='105165'
),
  ctee(L_U,C_U,L_PART,L_PHY,R_T,ORD_RUN,T_L,FINAL_T_L)
as
(select L_U,C_U,L_PART,L_PHY,R_T,ORD_RUN,T_L,FINAL_T_L from @allocation)
INSERT INTO @allocation VALUES (@L_U,@C_U,@L_PART,@L_PHY ,@R_T,@ORD_RUN ,@T_L ,@FINAL_T_L)select * from ctee
--SELECT L_U,C_U,L_PART,L_PHY,R_T,ORD_RUN,T_L,
--CASE
--WHEN T_L <= 0 THEN 0 ELSE T_L END AS FINAL_T_L
--FROM CTEC

--INSERT INTO @RESULT VALUES (@COR_UNIQUE,@COR_PART_ONLY,@COR_OUR_NUMBER,@COR_QTY_ORDERED);
  INSERT INTO @allocation VALUES( @L_U,@C_U,@L_PART,@L_PHY ,@R_T,@ORD_RUN ,@T_L ,@FINAL_T_L);
FETCH NEXT FROM cursor_results into @COR_UNIQUE,@COR_PART_ONLY,@COR_OUR_NUMBER,@COR_QTY_ORDERED ;
END
CLOSE cursor_results;
DEALLOCATE cursor_results;

【问题讨论】:

    标签: sql sql-server common-table-expression database-cursor


    【解决方案1】:

    当您定义 CTE 时,它在批次的生命周期内存在。

    在您的代码中,您将 ctee 定义为第 62 行的几个 CTE 中的最后一个,但随后立即在第 65 行执行 insert into - 这是该批次的 end

    以下select * from ctee 是一个 批次,未定义ctee

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2019-04-01
      相关资源
      最近更新 更多