获取光标以结束不定循环并显示临时表数据sql
我有一个带有游标和临时表的sql查询获取光标以结束不定循环并显示临时表数据sql,sql,sql-server,cursor,temp-tables,Sql,Sql Server,Cursor,Temp Tables,我有一个带有游标和临时表的sql查询 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 F
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 @ldt_cum as int
DECLARE @TestCursor as CURSOR
DECLARE @Blevel as INT
DECLARE @Bchild as NVARCHAR(50)
DECLARE @Ptype as NVARCHAR(50)
DECLARE @Bparent as NVARCHAR(50)
DECLARE @Bqty as NVARCHAR(50)
DECLARE @Ldtim as INT
DECLARE @Cissue as INT
DECLARE @Bmethod as INT
DECLARE @Rmethod as INT
DECLARE @Rqty as INT
DECLARE @Ldtime as INT
DECLARE @LdtimeforRQ as INT
DECLARE @cmldt as INT
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,
@cmldt as cumldtr
--, 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
--PRINT 'BomParent' + ' ' + 'BomQty' + ' ' + 'FSunit';
SET @TestCursor = CURSOR FOR
SELECT * FROM #CumLeadTimRep
OPEN @TestCursor
FETCH NEXT FROM @TestCursor INTO @Blevel, @Bchild, @Ptype, @Bparent, @Bqty, @Ldtim, @Cissue, @Bmethod, @Rmethod, @Rqty, @Ldtime, @LdtimeforRQ, @cmldt ;
SET @ldt_cum = 0
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ldt_cum = @ldt_cum + @Ldtime;
INSERT INTO #CumLeadTimRep (cumldtr) VALUES (@ldt_cum);
FETCH NEXT FROM @TestCursor INTO @Blevel, @Bchild, @Ptype, @Bparent, @Bqty, @Ldtim, @Cissue, @Bmethod, @Rmethod, @Rqty, @Ldtime, @LdtimeforRQ, @cmldt;
END
CLOSE @TestCursor;
DEALLOCATE @TestCursor;
它不是在temp表的末尾停止,而是进入一个无限循环。我怎样才能阻止这一切?此外,它会显示“xx行受影响”,而不是显示更改的临时表。如何显示更改临时表?且光标定义为?让我猜你读了#CumLeadTimRep并插入了它?向我们展示整个代码。我保证这可以而且应该在没有光标的情况下完成。@lad2025,用完整的代码更新了问题。@EvaldasBuinauskas更新了问题,因为我使用CTE,所以需要一个光标。@NisalUpendra所以我是对的,您可以循环使用插入到其中的同一个表。你不能只使用两个具有相同结构的表
#CumLeadTimRep_Input
和#CumLeadTimRep_result
???