【问题标题】:Issue with inserting temp table to recursive query in SQL Server在 SQL Server 中将临时表插入递归查询的问题
【发布时间】:2015-11-26 13:31:30
【问题描述】:

我有以下问题。

DECLARE @PartNo Char(22)
DECLARE @PartIssue AS CHAR(4)
DECLARE @Level AS INT
DECLARE @PartType AS CHAR(12)
DECLARE @TempLeadTime AS FLOAT
DECLARE @CumLeadTime AS FLOAT 
DECLARE @bomlforcursor  AS FLOAT
DECLARE @ldtimeforcursor AS FLOAT
DECLARE @temp_level as float
DECLARE @BomParent as NVARCHAR(50)
DECLARE @ldt as NVARCHAR(50)
DECLARE @TestCursor as CURSOR

SELECT @PartIssue = drawissno, @PartNo = partnum, @Level=1, @PartType = sm FROM partmaster  where partnum = 'AE40-0287810'

WITH Hierarchyct(BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty) AS
      (SELECT     @Level AS BOMLevel,
                        @PartNo AS bomchild, 
                        @PartType as parttype,
                        cast('' AS CHAR(22)) AS bomparent,  
                        cast(1.0 AS FLOAT) AS bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = @PartNo) AS ldtime,
                        @PartIssue as childissue, 
                        eccbom AS bmethod, 
                        eccroute as rmethod,
                        cast(1.0 AS FLOAT) AS requiredqty
                        --@CumLeadTime AS cumleadtime
      FROM eccissue 
      WHERE eccpart = @PartNo AND eccissueno = @PartIssue 

      UNION ALL
      SELECT            (hierarchyct.BOMLevel + 1) AS BOMLevel,
                        bom.bomchild, 
                        (SELECT sm from partmaster where partnum = bom.bomchild) as parttype,
                        bom.bomparent, 
                        bom.bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) as ldtime,
                        --(CASE WHEN (stock.stleadtim = 0 AND parttype = 'MANUFACTURED') THEN (bom.bomqty*routing.runtim) ELSE (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) END) AS ldtime,
                        (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AS childissue,
                        bom.baltmethod AS bmethod,    
                        (SELECT eccroute FROM eccissue WHERE eccissue.eccissueno = (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AND eccissue.eccpart = bom.bomchild ) as rmethod,
                        (bom.bomqty * hierarchyct.requiredqty) AS requiredqty
                       -- @CumLeadTime + leadtime as cumleadtime
      FROM bom  INNER JOIN hierarchyct ON bom.bomparent = hierarchyct.bmchild 


      WHERE bom.baltmethod =(SELECT eccbom FROM eccissue WHERE eccissue.eccpart = hierarchyct.bmchild AND eccissue.eccissueno = hierarchyct.childissue )
      )


SELECT * 
FROM
(     
SELECT      hierarchyct.*,
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.bmqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtime, --, SUM(1) as cumldtime
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.requiredqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtimeforRQ

--, SUM(1) as cumldtime
FROM  hierarchyct left outer join routing on part = bmchild and raltmethod = rmethod left outer join stock on stocknum = bmchild  left outer join partmaster on partnum = Hierarchyct.bmchild 
GROUP BY BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty, stleadtim, sm, part
--Where leadtime =0Mr1990
) as temp

这很好用,但是当我尝试使用此修改后的查询将最终结果放入临时表(我需要它来运行游标)时:

DECLARE @PartNo Char(22)
DECLARE @PartIssue AS CHAR(4)
DECLARE @Level AS INT
DECLARE @PartType AS CHAR(12)
DECLARE @TempLeadTime AS FLOAT
DECLARE @CumLeadTime AS FLOAT 
DECLARE @bomlforcursor  AS FLOAT
DECLARE @ldtimeforcursor AS FLOAT
DECLARE @temp_level as float
DECLARE @BomParent as NVARCHAR(50)
DECLARE @ldt as NVARCHAR(50)
DECLARE @TestCursor as CURSOR
CREATE TABLE #CumLeadTimRep (BOMLevel INT, bmchild NVARCHAR(50), parttype NVARCHAR(50), bomparent NVARCHAR(50), bmqty INT, leadtime INT, childissue NVARCHAR(50), bmethod INT, method INT, requiredqty INT, ldtime INT, ldtimeforRQ INT)
SELECT @PartIssue = drawissno, @PartNo = partnum, @Level=1, @PartType = sm FROM partmaster  where partnum = 'AE40-0287810'

WITH Hierarchyct(BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty) AS
      (SELECT     @Level AS BOMLevel,
                        @PartNo AS bomchild, 
                        @PartType as parttype,
                        cast('' AS CHAR(22)) AS bomparent,  
                        cast(1.0 AS FLOAT) AS bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = @PartNo) AS ldtime,
                        @PartIssue as childissue, 
                        eccbom AS bmethod, 
                        eccroute as rmethod,
                        cast(1.0 AS FLOAT) AS requiredqty
                        --@CumLeadTime AS cumleadtime
      FROM eccissue 
      WHERE eccpart = @PartNo AND eccissueno = @PartIssue 

      UNION ALL
      SELECT            (hierarchyct.BOMLevel + 1) AS BOMLevel,
                        bom.bomchild, 
                        (SELECT sm from partmaster where partnum = bom.bomchild) as parttype,
                        bom.bomparent, 
                        bom.bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) as ldtime,
                        --(CASE WHEN (stock.stleadtim = 0 AND parttype = 'MANUFACTURED') THEN (bom.bomqty*routing.runtim) ELSE (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) END) AS ldtime,
                        (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AS childissue,
                        bom.baltmethod AS bmethod,    
                        (SELECT eccroute FROM eccissue WHERE eccissue.eccissueno = (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AND eccissue.eccpart = bom.bomchild ) as rmethod,
                        (bom.bomqty * hierarchyct.requiredqty) AS requiredqty
                       -- @CumLeadTime + leadtime as cumleadtime
      FROM bom  INNER JOIN hierarchyct ON bom.bomparent = hierarchyct.bmchild 


      WHERE bom.baltmethod =(SELECT eccbom FROM eccissue WHERE eccissue.eccpart = hierarchyct.bmchild AND eccissue.eccissueno = hierarchyct.childissue )
      )


SELECT * INTO #CumLeadTimRep()
FROM
(     
SELECT      hierarchyct.*,
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.bmqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtime, --, SUM(1) as cumldtime
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.requiredqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtimeforRQ

--, SUM(1) as cumldtime
FROM  hierarchyct left outer join routing on part = bmchild and raltmethod = rmethod left outer join stock on stocknum = bmchild  left outer join partmaster on partnum = Hierarchyct.bmchild 
GROUP BY BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty, stleadtim, sm, part
--Where leadtime =0Mr1990
) as temp

SELECT * FROM #CumLeadTimRep

我收到以下错误。

消息 2714,第 16 级,状态 1,第 51 行
数据库中已经有一个名为“#CumLeadTimRep”的对象。

消息 156,第 15 级,状态 1,第 62 行
关键字“as”附近的语法不正确。

尝试了很多,但没有得到解决。可能是什么问题?

【问题讨论】:

  • 错误信息在哪里?
  • 这个错误似乎很容易解释......您正在尝试创建一个已经存在的表。要在使用 SELECT * INTO #CumLeadTimRep 创建表之前更正此问题,只需在尝试创建表之前添加检查表是否已存在 -- IF OBJECT_ID(N'tempdb..#CumLeadTimRep', 'U') IS NOT NULL DROP TABLE #CumLeadTimRep;
  • SELECT * INTO #CumLeadTimRep 创建表。如果它已经存在,它将引发错误。而是先创建表一次,然后使用INSERT INTO #CumLeadTimRep (column1,column2....) SELECT .....
  • 解决此问题的最简单方法是声明表变量或临时表,然后将其插入其中,而不是动态创建。
  • "这是否意味着,要创建一个临时表,我不需要创建表语句"。这是你的问题。你没有有一个create table 语句。你有一个SELECT INTO,它每次都会尝试创建它。第二次已经存在了。如果您有 one 在顶部创建表(或者更好的是 DECLARE Table 变量)并使用 INSERT SELECT 就可以了。

标签: sql sql-server common-table-expression temp-tables


【解决方案1】:

找到了答案。问题在于尝试创建一个已经存在的表。正确的语法如下:

DECLARE @PartNo Char(22)
DECLARE @PartIssue AS CHAR(4)
DECLARE @Level AS INT
DECLARE @PartType AS CHAR(12)
DECLARE @TempLeadTime AS FLOAT
DECLARE @CumLeadTime AS FLOAT 
DECLARE @bomlforcursor  AS FLOAT
DECLARE @ldtimeforcursor AS FLOAT
DECLARE @temp_level as float
DECLARE @BomParent as NVARCHAR(50)
DECLARE @ldt as NVARCHAR(50)
DECLARE @TestCursor as CURSOR
IF OBJECT_ID('tempdb.dbo.#CumLeadTimRep') IS NOT NULL 
begin
DROP TABLE #CumLeadTimRep
end
--CREATE TABLE #CumLeadTimRep (BOMLevel INT, bmchild NVARCHAR(50), parttype NVARCHAR(50), bomparent NVARCHAR(50), bmqty INT, leadtime INT, childissue NVARCHAR(50), bmethod INT, method INT, requiredqty INT, ldtime INT, ldtimeforRQ INT)
SELECT @PartIssue = drawissno, @PartNo = partnum, @Level=1, @PartType = sm FROM partmaster  where partnum = 'AE40-0287810'
WITH Hierarchyct(BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty) AS
      (SELECT     @Level AS BOMLevel,
                        @PartNo AS bomchild, 
                        @PartType as parttype,
                        cast('' AS CHAR(22)) AS bomparent,  
                        cast(1.0 AS FLOAT) AS bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = @PartNo) AS ldtime,
                        @PartIssue as childissue, 
                        eccbom AS bmethod, 
                        eccroute as rmethod,
                        cast(1.0 AS FLOAT) AS requiredqty
                        --@CumLeadTime AS cumleadtime
      FROM eccissue 
      WHERE eccpart = @PartNo AND eccissueno = @PartIssue 

      UNION ALL
      SELECT            (hierarchyct.BOMLevel + 1) AS BOMLevel,
                        bom.bomchild, 
                        (SELECT sm from partmaster where partnum = bom.bomchild) as parttype,
                        bom.bomparent, 
                        bom.bomqty, 
                        (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) as ldtime,
                        --(CASE WHEN (stock.stleadtim = 0 AND parttype = 'MANUFACTURED') THEN (bom.bomqty*routing.runtim) ELSE (SELECT stleadtim FROM stock WHERE stocknum = bom.bomchild) END) AS ldtime,
                        (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AS childissue,
                        bom.baltmethod AS bmethod,    
                        (SELECT eccroute FROM eccissue WHERE eccissue.eccissueno = (CASE WHEN LTRIM(RTRIM(bom.bomissue)) = 'CURR' THEN (SELECT drawissno FROM PartMaster WHERE PartNum = bom.bomchild) ELSE bom.bomissue END) AND eccissue.eccpart = bom.bomchild ) as rmethod,
                        (bom.bomqty * hierarchyct.requiredqty) AS requiredqty
                       -- @CumLeadTime + leadtime as cumleadtime
      FROM bom  INNER JOIN hierarchyct ON bom.bomparent = hierarchyct.bmchild 


      WHERE bom.baltmethod =(SELECT eccbom FROM eccissue WHERE eccissue.eccpart = hierarchyct.bmchild AND eccissue.eccissueno = hierarchyct.childissue )
      )

SELECT * INTO #CumLeadTimRep
FROM
(     
SELECT      hierarchyct.*,
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.bmqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtime, --, SUM(1) as cumldtime
CASE WHEN (stleadtim = 0 AND partmaster.sm = 'MANUFACTURED') THEN (Hierarchyct.requiredqty*sum(routing.runtim)) ELSE stleadtim  END AS ldtimeforRQ
--, SUM(1) as cumldtime
FROM  hierarchyct left outer join routing on part = bmchild and raltmethod = rmethod left outer join stock on stocknum = bmchild  left outer join partmaster on partnum = Hierarchyct.bmchild 
GROUP BY BOMLevel,bmchild, parttype, bomparent, bmqty, leadtime, childissue,bmethod,rmethod, requiredqty, stleadtim, sm, part
--Where leadtime =0Mr1990
) as temp
SELECT * FROM #CumLeadTimRep

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2014-12-19
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多