在 SQL 中使用多个 CTE 填充表的存储过程中出现错误

问题描述 投票:0回答:1

我创建并更改了我的存储过程,但是在执行它时出现错误:

消息 208,级别 16,状态 1,过程 Sp_Inventory_PrMonth,第 112 行 [批量开始行 139]
无效的对象名称“report_cte”

我的问题是之前没有使用

";"
,我无法解决它。

ALTER PROCEDURE Sp_Inventory_PrMonth
    (@currentdate DATE)
AS
BEGIN
    DECLARE  @first_day_prior_month DATE, @last_day_prior_month DATE;

    -- Calculate the first and last day of the prior month
    SET @first_day_prior_month = DATEADD(mm, DATEDIFF(mm, 0, @currentdate) - 1, 0); 

    SET @last_day_prior_month = EOMONTH(@first_day_prior_month);

    ;WITH [dates_cte] AS 
    (
        SELECT * 
        FROM (VALUES ('2019-09-01', '2019-09-30', '201909'),
                     ('2022-10-01', '2022-11-01', '202210'),
                     ('2022-11-01', '2022-12-01', '202211')) AS [t]([start_date], [end_date], [period])
    ),
    [inventory_cte] AS
    (
        SELECT
            [vi].[database_id],
            [YYYYMM] = [d].[period],
            [State] = CASE 
                          WHEN [vi].[database_id] LIKE 'STORE4%' 
                              THEN 'QLD' 
                              ELSE 'NSW' 
                      END,
            [vi].[nkey],
            [Type] = CASE 
                         WHEN [vi].[VehicleInventoryTypeID] = 'Used' 
                             THEN 'Used'
                             ELSE CASE 
                                      WHEN ([vi].[StatusID] IN ('4', '7', '8') OR ([vi].[StatusID] IN ('6', '13') AND [vi].[PreSaleStatusID] IN ('4', '7', '8'))) 
                                          THEN 'Demo'
                                          ELSE 'New' 
                                  END
                     END,
           [Location_Code] = [vi].[database_id] + '_' + [vi].[LocationID],
           [Make] = CASE 
                        WHEN [vi].[VehicleInventoryTypeID] = 'Used' 
                            THEN 'Used' 
                            ELSE [vi].[ManufacturerID] 
                    END,
           [vi].[StatusID],
           [vi].[ReceiptDate],
           [vi].[DeliveryDate],
           [vi].[ActivityDate],
           [vi].[CostAmount],
           [Vi].[VehicleInventoryTypeID]
       FROM
           [PDW_SQLSERVER].[510102_DataWarehouse].[dbo].[VehicleInventory] AS [vi]
       INNER JOIN
           [dates_cte] AS [d] ON [vi].[ReceiptDate] < [d].[end_date]
                              AND (([vi].[StatusID] NOT IN ('6', '13'))
                                   OR ([vi].[StatusID] IN ('6') AND [vi].[DeliveryDate] > [d].[end_date])
                                   OR ([vi].[StatusID] IN ('13') AND [vi].[ActivityDate] > [d].[end_date]))
                              AND [vi].[StatusID] NOT IN ('9')
                              AND [vi].[LocationID] NOT IN ('ORD', 'NHY', 'CHTA', 'SMA')
       WHERE 
           [vi].[database_id] IN ('STORE201', 'STORE214', 'STORE217', 'STORE401')
    ),
    [report_cte] AS
    (
        SELECT 
            [i].[YYYYMM],
            [i].[State],
            [i].[Location_Code],
            [i].[Make],
            [i].[Type],
            [i].[nkey],
            [i].[CostAmount]
        FROM 
            [inventory_cte] AS [i]
    )
    -- Delete any existing data from the prior month from the table
    DELETE FROM [dbo].[Floorplan_Summary]
    WHERE [Period] = CONVERT(varchar(6), @first_day_prior_month, 112) 

    -- Insert the data for the prior month into the table
    INSERT INTO [dbo].[Floorplan_Summary]
                     ([Period], [State], [Location_Code], [Make],[Type],
                      [Floorplan_Unit_Count], [Floorplan_Cost_Amount])
        SELECT
            [t].[YYYYMM], [t].[State], [t].[Location_Code],
            [t].[Make], [t].[Type],
            [n] = COUNT([t].[nkey]), 
            [Total] = SUM([t].[CostAmount])
        FROM
            [report_cte] AS [t]
        WHERE
            [t].[YYYYMM] = CONVERT(varchar(6), @first_day_prior_month, 112)
        GROUP BY
            [t].[YYYYMM], [t].[State], [t].[Type],
            [t].[Location_Code], [t].[Make]
    END

    --execute Sp_Inventory_PrMonth '2022-12-10'

我希望我的程序获取日期参数并在表中填充前一个月的数据。

stored-procedures common-table-expression
1个回答
1
投票

我找到了解决方案,在CTE之后我们无法使用Delete语句,所以我必须使用“select into”并首先在临时表中导入数据,然后删除语句,然后从临时表插入到我的表中

© www.soinside.com 2019 - 2024. All rights reserved.