什么时候绝对需要程序查询?

Tho*_*ger 8 sql-server t-sql cursors

我知道我们倾向于不惜一切代价避免在 SQL Server 中使用游标和循环,但是在哪些情况下您绝对需要过程查询,而基于集合的查询不会给您结果?

我了解两者之间的区别,我只是从未遇到过需要使用游标的情况。我想知道是否有这样的情况。

bil*_*nkc 9

根据我的经验,我遇到过几次需要程序/迭代方法的情况。

API 只允许单行操作

如果我想以编程方式将具有 500 个错误类型列的表中的数据类型从实数更改为这个SO 问题所问的列,游标是一种很好的方法,因为 DDL 不允许在单个语句中更改多个列。

基于集合不缩放

如果您有SQL Server MVP Deep Dives一书,那么Hugo Kornelis 的第 4 章“基于集合的迭代:第三种选择”有一些基于游标/集合的组合操作的很好的用例。本章作者引用的两个经典问题是运行总计装箱

对于我在上一份工作中继承的设计不佳的流程,我使用了基于集合的迭代方法并取得了成功。简而言之,有一个过程每年必须更新 50-75M 行,而尝试在一个集合中这样做会破坏我们的日志。通过将更新分块为 N 行的较小批次,它允许日志跟上并且实际上完成速度比上一年他们刚刚分配了 1 公吨多的磁盘空间时更快。


gbn*_*gbn 6

当某些事情无法完成时。

流血当然很明显。但请注意,“不基于集合”和使用程序解决方案的人存在差异,因为他们不理解集合或不知道如何使用基于集合的代码来实现。

程序代码的一个示例是每行发送一封电子邮件,每行具有不同的内容

很多供 DBA 使用的 SQL 代码是过程性的。例如,在数据库和表上循环(CURSOR 或 WHILE:没有区别)以重建索引和更新统计信息。

一些 SQL 构造允许在集合的上下文中逐行处理,例如 CROSS APPLY 像这样在 SO: SELECT TOP 5 rows for each FK(注意 ROW_NUMBER() 解决方案)

编辑:扩展@billinkc 的答案...

CROSS APPLY 允许使用具有“单行 API”的 UDF 进行基于集合的操作