2015-09-01 438 views
0

我有以下查詢。將臨時表插入到SQL Server中的遞歸查詢問題

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 
         [email protected] 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 
         [email protected] 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' 的對象。

Msg 156,Level 15,State 1,Line 62
關鍵字'as'附近的語法不正確。

試了很多,但沒有得到修復。可能是什麼問題?

+0

哪裏有錯誤信息? – lad2025

+0

加了他們,對不起,我忘了。 –

+1

錯誤似乎相當自我解釋....你正試圖創建一個已經存在的表。要在使用'SELECT * INTO#CumLeadTimRep'創建表之前糾正這個問題,只需添加一個檢查來查看錶是否已經存在,然後再嘗試創建它 - IF IF OBJECT_ID(N'tempdb ..#CumLeadTimRep',' U')不是NULL DROP TABLE #CumLeadTimRep;' – GarethD

回答

0

找到了答案。問題是試圖創建一個已經存在的表。正確的語法如下:

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 
         [email protected] 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