提问人:Anusha 提问时间:12/13/2022 最后编辑:marc_sAnusha 更新时间:12/13/2022 访问量:51
要使用的 TSQL 查询 While 循环迭代替换游标 [closed]
TSQL query to use While loop iteratively to replace cursor [closed]
问:
我有以下代码,我试图替换光标,我想逐个迭代地遍历每个 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
请帮帮我!提前致谢。
答:
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 关键字
评论
WHILE
和光标一样糟糕......