【发布时间】: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