【问题标题】:How to Insert into temp table Using SubQuery and Select from Temp table如何使用子查询插入临时表并从临时表中选择
【发布时间】:2020-10-05 07:02:27
【问题描述】:

我正在尝试将此数据插入临时表 当我使用第二个结果集#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,1,'')
    SELECT @wh_List2 = STUFF((SELECT ',['+l.Warehouse+' QtyOnOrder]' FROM CompanyA..InvWhControl l WHERE l.Warehouse IS NOT NULL FOR XML PATH('')),1,1,'')

    --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]', 'varchar(max)') AS DATETIME),'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, FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]', 'varchar(max)') AS DATETIME),'yyyy/MM/dd'),100)  
   BETWEEN ISNULL(@FromDate,CONVERT(VARCHAR, FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]', 'varchar(max)') AS DATETIME),'yyyy/MM/dd'),100)) 
   AND ISNULL(@ToDate,CONVERT(VARCHAR, FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]', 'varchar(max)') AS DATETIME),'yyyy/MM/dd'),100))


   --WHERE FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]', 'varchar(max)') AS DATETIME),'HH:mm:ss') >= '2020-02-01'
   --AND FORMAT(CAST(CAST(s.Event AS XML).value('(/OperationTrackingLog/TimeStamp)[1]', 'varchar(max)') AS DATETIME),'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```

【问题讨论】:

    标签: sql-server subquery temp-tables


    【解决方案1】:

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

    请注意,提供的“代码”用于显示结构 - 您需要从上方添加文本块并正常修复错误。下面演示如何解决此问题。


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

    如果希望将最终结果(例如,来自数据透视表)存储在临时表中,请删除当前的 '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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      相关资源
      最近更新 更多