要使用的 TSQL 查询 While 循环迭代替换游标 [closed]

TSQL query to use While loop iteratively to replace cursor [closed]

提问人:Anusha 提问时间:12/13/2022 最后编辑:marc_sAnusha 更新时间:12/13/2022 访问量:51

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

12个月前关闭。

我有以下代码,我试图替换光标,我想逐个迭代地遍历每个 fileid,并将该单个 fileid 的输出每次分配给变量 @fil,但它打印所有迭代的所有内容。浏览了许多论坛,但找不到解决方案。我知道光标中的解决方案,但这对我来说是新的!

DECLARE @i INT = 0;
DECLARE @count INT, @fil varchar(100) 
SELECT @count=  COUNT(DISTINCT m.FileID)
FROM [EDW].[FileMaster] m 

WHILE @i <= @count
BEGIN
       
    @filid = SELECT DISTINCT m.FileID 
FROM [EDW].[FileMaster] m
    --OFFSET @i ROWS   
    --FETCH NEXT 1 ROWS ONLY  
    SET @i = @i + 1;
print @fileid
END

预期输出为abc.txt def.txt ghi.txt etc

请帮帮我!提前致谢。

sql-server t-sql while-loop 游标 database-cursor

评论

1赞 marc_s 12/13/2022
WHILE和光标一样糟糕......

答:

1赞 jigga 12/13/2022 #1

你可以试试这个,但你错过了SQL的全部意义......

DECLARE @i INT = 0; 
DECLARE @count INT = COUNT(DISTINCT FileID) FROM [EDW].[FileMaster]);
DECLARE @fil varchar(100);

WHILE @i <= @count 
BEGIN 
SET @fil = SELECT DISTINCT FileID FROM [EDW].[FileMaster] 
ORDER BY FileID OFFSET @i ROWS FETCH NEXT 1 ROWS ONLY
SET @i = @i + 1; 
print @fil 
END;

您可以创建具有不同 FileID 的临时表一次,然后循环遍历它

评论

0赞 Anusha 12/13/2022
谢谢你,我很感激,这很合适。临时表也不是需要 OFFSET 和提取到变量吗,我的方法有什么区别,我也可以真正适应该解决方案,您能否在上述解决方案下方添加您的解决方案,我将不胜感激@jigga
0赞 jigga 12/14/2022
临时表解决方案只是为了性能...如果您的表不是太大和/或 FileID 上有索引,则不需要临时表。否则,请从 EDW 中选择 DISTINCT FileID INTO #tmp。文件主。之后,更换 EDW。带有 #tmp 的 FileMaster 并删除 DISTINCT 关键字