【发布时间】: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