【发布时间】:2021-03-14 09:58:27
【问题描述】:
我对嵌套游标场景中的变量声明有疑问。
这是我找到的一个小的嵌套光标示例。在我见过的其他示例中,我还在第一个游标中找到了 DECLARE 子句。
DECLARE @ClientID int;
DECLARE Cur1 CURSOR FOR SELECT ClientID From Folder;
OPEN Cur1
FETCH NEXT FROM Cur1 INTO @ClientID;
SELECT @FETCH_Cur1 = @@FETCH_STATUS
WHILE @FETCH_Cur1 = 0
BEGIN
DECLARE @UID int;
DECLARE Cur2 CURSOR FOR SELECT UID FROM Attend Where ClientID=@ClientID;
OPEN Cur2;
FETCH NEXT FROM Cur2 INTO @UID;
SELECT @FETCH_Cur2 = @@FETCH_STATUS
WHILE @FETCH_Cur2 = 0
BEGIN
PRINT 'Found UID: ' + Cast(@UID as Varchar);
FETCH NEXT FROM Cur2 INTO @UID;
SELECT @FETCH_Cur2 = @@FETCH_STATUS
END;
CLOSE Cur2;
DEALLOCATE Cur2;
FETCH NEXT FROM Cur1 INTO @ClientID;
SELECT @FETCH_Cur1 = @@FETCH_STATUS
END;
PRINT 'DONE';
CLOSE Cur1;
DEALLOCATE Cur1;
代码有效,但我怀疑它是否正确第一个光标内的声明。
DECLARE @UID int;
不应该像其他编程语言那样将声明放在代码的开头吗?
【问题讨论】:
-
当然,虽然是一个不同的问题,但真正的问题是,当 SQL 是一种基于集合的语言时,为什么要首先使用游标。
-
很明显,这不是使用嵌套游标的场景,它只是一个简化的示例。但有时我需要使用它们,例如,如果我想为每条记录调用一个外部 sp,等等......
-
编写(任何语言的)代码,清楚地表达其目标并且易于理解。遵守这些规则,你应该毫无疑问。仅仅因为你可以做一些事情并不意味着你应该做。使用棘手的范围规则只会使代码更难理解,更难更改/更正。
标签: sql-server variables cursors