如何使用子查询插入到临时表并从临时表中选择

问题描述

我正在尝试将此数据插入到临时表中 当我添加片段以将第二个结果集#Temp插入到我的临时表中时 我收到不正确的语法错误 有任何想法吗?

sql

-- =============================================
-- Author:      <Kaven>
-- Create date: <August 2020>
-- Description: Summary Report of [spRPWipManufactureProcessLogR1]
-- Owner : RpData.dll
-- =============================================
ALTER PROCEDURE [dbo].[spRPWipManufactureProcessLogR2]
    @FromDate DATE = null,@ToDate DATE = null,@Location NVARCHAR(15) =null,--Dropdown  --CostCentre
    @Operation NVARCHAR(15) = NULL,-- Dropdown --WorkCentre
    @JobNumber nvarchar(15) = NULL
AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
--EXEC [spRPWipManufactureProcessLogR2] '20200201','20200301'
    IF @Operation = ''
    BEGIN
    SET @Operation = null
    END
    IF @JobNumber = ''
    BEGIN
    SET @JobNumber = NULL
    END
    IF OBJECT_ID(N'tempdb..#Temppp_WarehouseList') IS NOT NULL
    BEGIN DROP TABLE #Temppp_WarehouseList  END

    SELECT StockCode
    INTO #Temppp_WarehouseList 
    FROM CompanyA..InvMaster 
    
      
    DECLARE 
    @wh_List NVARCHAR(1000),@wh_List2 NVARCHAR(1000)

    SELECT @wh_List = STUFF((SELECT ',['+l.Warehouse+' QtyOnHand]' FROM CompanyA..InvWhControl l WHERE l.Warehouse IS NOT NULL FOR XML PATH('')),1,'')
    SELECT @wh_List2 = STUFF((SELECT ',['+l.Warehouse+' QtyOnorder]' FROM CompanyA..InvWhControl l WHERE l.Warehouse IS NOT NULL FOR XML PATH('')),'')

    --SELECT @wh_List 
    --SELECT @wh_List2  

    SELECT ProductID,FromDate,ToDate,QtyBUoM
    INTO #TempBuOM
    FROM Cetus.dbo.SMDemandForcastDailyHierarchy df
    JOIN dbo.SMDemandSourceTypeDef st ON st.pkDFSourceTypeID = df.fkSourceType 
    WHERE 
    df.DemandSource = st.pkDFSourceTypeID 
    AND
    df.Parent = st.pkDFSourceTypeID 
    AND FromDate <= GETDATE()
    AND ToDate >= GETDATE()
    SELECT * FROM #TempBuOM



   SELECT * FROM #Temppp_WarehouseList t  
   INNER join   
   (SELECT *   FROM
   (SELECT Warehouse+' QtyOnHand' 'WarehouSEOnHand',Warehouse+' QtyOnorder' 'WarehouSEOnorder',QtyOnHand,QtyOnorder,b.CostCentre AS 'Location',--b.WorkCentre AS [Operation],-- arc.Job AS [Job Number],--FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]','varchar(max)') AS DATETIME),'HH:mm:ss') AS [Operation Compeleted Time],-- CONVERT(VARCHAR,FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]','yyyy/MM/dd'),100)  AS [Operation Compeleted Date],-- CONVERT(Date,CONVERT(date,arc.DTComplete))AS [Compeleted Date],df.ProductID AS 'Product ID',m.Description AS 'Stock Code DESCRIPTION',arc.QtyTomake AS 'Quantity To Make',arc.QtyManufactured 'Quantity Manufactured',df.QtyBUoM AS 'Daily Demand',inv.QtyOnorder AS 'Quantity On Order',inv.QtyOnHand AS 'Stock Levels'
   INTO #TEMP -- Error comes here
   FROM Cetus..WIPManufactureProcessLog s    
   LEFT JOIN WIP..WipMaster_Arc arc ON s.JobId = arc.Job   
   JOIN CompanyA..InvMaster m ON arc.StockCode = m.StockCode   
   JOIN CompanyA..InvWarehouse inv ON m.StockCode = inv.StockCode   
   JOIN CompanyA.dbo.BomOperations bo ON m.StockCode = bo.StockCode AND bo.Operation = s.Operation   
   JOIN CompanyA..BomWorkCentre b ON bo.WorkCentre = b.WorkCentre    
   JOIN [dbo].SMDemandForcastDailyHierarchy df ON m.StockCode = df.ProductID   
   JOIN dbo.SMDemandSourceTypeDef st ON st.pkDFSourceTypeID = df.fkSourceType 
   --EXEC [spRPWipManufactureProcessLogR2] '20190101','20200201'

   Where CONVERT(VARCHAR,100)  
   BETWEEN ISNULL(@FromDate,CONVERT(VARCHAR,100)) 
   AND ISNULL(@ToDate,100))


   --WHERE FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]','HH:mm:ss') >= '2020-02-01'
   --AND FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]','HH:mm:ss') <= '2020-03-01 '  
   AND m.WarehousetoUse <>'AA'   
   AND b.WorkCentre = ISNULL(@Location,b.WorkCentre )
   AND b.CostCentre = ISNULL(@Operation,b.CostCentre )
   AND arc.Job = ISNULL(@JobNumber,arc.Job)   )p     
   PIVOT     (
   SUM(QtyOnHand) FOR WarehouSEOnHand IN
   ([BB QtyOnHand],[16 QtyOnHand],[IS QtyOnHand],[MS QtyOnHand],[MH QtyOnHand],[AA QtyOnHand],[BC QtyOnHand],[PH QtyOnHand],[P4 QtyOnHand],[PL QtyOnHand],[CC QtyOnHand],[SR QtyOnHand],[TS QtyOnHand],[WW QtyOnHand])) AS pvt 
   PIVOT     
   (SUM(QtyOnorder) FOR WarehouSEOnorder IN 
   ([BB QtyOnorder],[16 QtyOnorder],[IS QtyOnorder],[MS QtyOnorder],[MH QtyOnorder],[AA QtyOnorder],[BC QtyOnorder],[PH QtyOnorder],[P4 QtyOnorder],[PL QtyOnorder],[CC QtyOnorder],[SR QtyOnorder],[TS QtyOnorder],[WW QtyOnorder])) AS pvt2  GROUP BY  )
   AS z  on t.StockCode = z.[Product ID]

  ```sql```

解决方法

编辑:添加了答案,以防#TEMP表具有内部查询而不是最终数据透视结果。

请注意,此处提供的“代码”用于显示结构-您需要从上方添加文本板,然后像往常一样对它们进行错误修复。下面是演示如何解决此问题的方法。


INTO #TEMP在FROM语句的中间(实际上不是最终选择),因此不起作用。

如果要将最终结果(例如,来自数据透视表的结果)存储在temp表中,请删除当前的“ INTO #TEMP”并将其放入外部查询中,例如,

SELECT   *
    INTO  #TEMP
    FROM (your whole pivot statement) AS a

或使用CTE

; WITH CTE AS
    (your whole pivot statement)
  SELECT *
    INTO #Temp
    FROM CTE

另一方面,如果您要将内部查询的结果(不是不是枢轴)存储在临时表中,则

  1. 首先运行该关键字(例如,将您在那里的内部查询提取到自己的语句中)
  2. 在更大的查询中使用#temp表
-- Initial creation of temp table (SQL extracted from your current code)
SELECT Warehouse+' QtyOnHand' (... and rest of fields)
    INTO #Temp
    FROM Cetus..WIPManufactureProcessLog s 
        (... and rest of from,and where clauses)
-- And then use that in your pivot
SELECT * 
FROM 
   (SELECT * 
   FROM #Temppp_WarehouseList t  
   INNER join #TEMP ON (... matching fields)
   ) p
PIVOT
   (pivot commands etc)