Aar*_*and 14
当然(为了讨论的目的,让我们假设while 循环和游标基本上是一样的,抛出任何使用 while 循环避免游标的参数,这根本不是真的,除非以最迂腐的方式):
还有一些元数据操作可能需要使用游标,例如禁用和重新启用每个表上的所有外键约束。就我个人而言,我一直更喜欢在可以立即执行的查询中构建一个字符串,但出于各种原因,您可能不想这样做。例如,我没有在这个答案中使用单个游标,尽管我可以使用并且编写. (还要注意,像这样的解决方案 - 以及许多看似基于集合的查询 - 从技术上讲仍然在幕后使用光标 - 你只是实际上并没有写DECLARE CURSOR
......)
构建一个基于集合的查询来执行游标的功能也可能非常复杂,并且通常不值得投入时间或由于查询的复杂性而影响未来的可维护性,而游标实际上要简单得多(即使它的效率较低)。为了提高效率,如果您将游标解决方案与基于集合的解决方案进行比较,请确保使用最高效的游标选项 - 这些选项会产生很大的不同。
对于您从头开始构建且没有任何这些约束的普通查询,我不知道在某些情况下您必须使用游标,尤其是当 SQL Server 继续添加窗口函数和其他有助于实现更多功能的功能时过去通常需要游标的高级基于集合的编程。
如果你在写一个游标,你应该问自己,“有没有一种基于集合的方法来做到这一点?” 取决于代码的用途、重复使用多少、是否是一次性任务等,答案几乎总是单方面的,“是的!” 但对这个问题的一个完全有效的答案也可能是,“是的,但谁在乎呢?”
游标实际上是问题的最佳性能、支持、记录和保证的解决方案的示例是否就足够了?一个这样的例子是在 SQL Server < 2012 中计算运行总数。我在这里写了博客- 实际上证明在我的用例中,游标比所有其他常见方法都快,即使是经常推荐的(但不保证、记录或支持) )“古怪的更新”方法。(仅当新的 2012LAG
功能不是一个选项时,在这种情况下,它会围绕其他所有功能运行)。
归档时间: |
|
查看次数: |
1975 次 |
最近记录: |