如何循环访问 CTE 的结果集?

问题描述 投票:0回答:1

我在选择时遇到问题,收到错误消息

消息 208,第 16 级,状态 1,第 18 行
无效的对象名称“列表”。

怎么了?

DECLARE @end datetime = getdate(),
    @start datetime = CAST('01/01/2023' as datetime),
    @counter INT,
    @MaxId INT, 
    @name NVARCHAR(100);

WITH list as (
    SELECT  DISTINCT ROW_NUMBER() OVER( ORDER BY KodDokumentu) as id, KodDokumentu
    FROM [dbo].[view_list]
    WHERE IdMagazynu = 15 and IdStatusu >= 50 and DataZatw >= @start and DataZatw <= @end
    GROUP BY KodDokumentu
)
SELECT @counter = min(id) , @MaxId = max(id) 
FROM list

WHILE(@counter IS NOT NULL AND @counter <= @MaxId)
BEGIN
    SELECT @name = KodDokumentu
    FROM list WHERE id = @counter

    PRINT CONVERT(VARCHAR,@counter) + '. kod dokumentu ' + @name 
    SET @counter  = @counter  + 1        
END

我想用 CTE 开始循环。

PRINT
命令仅是示例。

t-sql while-loop common-table-expression
1个回答
0
投票

您的 CTE 对应于以下内容

select

SELECT @counter = min(id) , @MaxId = max(id) 
FROM list

除此之外它就不再存在了

SELECT
。 [list] 在任何后续查询中都不存在。

一个想法是放入#temp 表中,重新读取变量,然后继续使用相同的代码:

--stays the same
WITH list as (SELECT  DISTINCT ROW_NUMBER() OVER( ORDER BY KodDokumentu) as id, KodDokumentu
FROM [dbo].[view_list]
where IdMagazynu = 15 and IdStatusu >= 50 and DataZatw >= @start and DataZatw <= @end
group by KodDokumentu)

-- change to select INTO
SELECT *
into #list
FROM list

--rerun variable assignments
SELECT @counter = min(id) , @MaxId = max(id) 
FROM #list


-- the rest of the while loop stays the same
WHILE(@counter IS NOT NULL....
© www.soinside.com 2019 - 2024. All rights reserved.