【发布时间】:2010-09-08 21:14:00
【问题描述】:
假设我有以下简单的表变量:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
如果我想遍历行,那么声明和使用游标是我唯一的选择吗?还有其他方法吗?
【问题讨论】:
-
虽然我不确定您在上述方法中看到的问题;看看这是否有帮助.. databasejournal.com/features/mssql/article.php/3111031
-
您能否向我们提供您想要迭代行的原因,可能存在其他不需要迭代的解决方案(并且在大多数情况下速度更快)
-
同意pop...根据情况可能不需要光标。但是如果需要,使用游标没有问题
-
您没有说明为什么要避免使用光标。请注意,游标可能是最简单的迭代方式。您可能听说游标是“坏的”,但与基于集合的操作相比,它确实是对表的迭代。如果你不能避免迭代,游标可能是最好的方法。锁定是游标的另一个问题,但这与使用表变量时无关。
-
使用游标不是您的only选项,但如果您无法避免逐行方法,那么它将是您的最佳选择。 CURSOR 是一种内置结构,它比执行您自己的愚蠢 WHILE 循环更高效且不易出错。大多数情况下,您只需要使用
STATIC选项来消除对基表的不断重新检查和默认情况下存在的锁定,从而导致大多数人错误地认为 CURSOR 是邪恶的。 @JacquesB 非常接近:重新检查结果行是否仍然存在+锁定是问题所在。STATIC通常会解决这个问题:-)。
标签: sql-server tsql loops