【发布时间】:2010-09-22 04:39:37
【问题描述】:
我可以理解由于开销和不便而希望避免使用光标,但看起来有一些严重的光标恐惧症正在发生,人们会竭尽全力避免使用光标。
例如,一个问题询问如何使用游标做一些明显微不足道的事情,而接受的答案是使用带有递归自定义函数的公用表表达式 (CTE) 递归查询提出的,即使这限制了可能的行数处理到 32(由于 sql server 中的递归函数调用限制)。这让我觉得这是一个糟糕的系统寿命解决方案,更不用说为了避免使用简单的光标而付出的巨大努力。
这种疯狂仇恨的原因是什么?是否有一些“著名的权威”发布了针对游标的教令?游标的心里是不是潜伏着某种无法言喻的邪恶,败坏了孩子的道德之类的?
Wiki 问题,对答案比代表更感兴趣。
相关信息:
SQL Server Fast Forward Cursors
编辑:让我更准确地说:我知道 不应使用游标来代替正常的关系操作;这很简单。我不明白的是,即使光标是一个更简单和/或更有效的解决方案,人们也会竭尽全力避免光标,就像他们有笨蛋或其他东西一样。让我困惑的是非理性的仇恨,而不是明显的技术效率。
【问题讨论】:
-
我认为您的编辑说明了一切......在几乎所有情况下(我遇到过)都有一种方法可以用性能更好的集合替换光标基于情况。您说的很简单,但您了解差异。
-
我喜欢这个问题的标签!
-
关于递归 CTE 限制为
32的部分是无稽之谈。大概您正在考虑递归触发器和32的最大值@@NESTLEVEL。可以在查询中使用OPTION (MAXRECURSION N)设置,默认100和0表示无限制。 -
@MartinSmith:默认限制现在是 100,最大值是 32K sql-server-helper.com/error-messages/msg-310.aspx
-
@MartinSmith:谢谢,我的错误——实际上是两个错误;)第一个是误读了参考资料(我假设 32K 限制 = 'unlimited'),第二个是错误的原因——在引用的例子中, 32 的递归限制来自递归函数,而不是 CTE。当时我可能正在使用 SQL Server 2000,或者可能是 2008,希望现在更好:)。已编辑问题以澄清 - 感谢您的更正!
标签: sql database-cursor