Tho*_*ger 8 sql-server t-sql cursors
我知道我们倾向于不惜一切代价避免在 SQL Server 中使用游标和循环,但是在哪些情况下您绝对需要过程查询,而基于集合的查询不会给您结果?
我了解两者之间的区别,我只是从未遇到过需要使用游标的情况。我想知道是否有这样的情况。
根据我的经验,我遇到过几次需要程序/迭代方法的情况。
如果我想以编程方式将具有 500 个错误类型列的表中的数据类型从实数更改为这个SO 问题所问的列,游标是一种很好的方法,因为 DDL 不允许在单个语句中更改多个列。
如果您有SQL Server MVP Deep Dives一书,那么Hugo Kornelis 的第 4 章“基于集合的迭代:第三种选择”有一些基于游标/集合的组合操作的很好的用例。本章作者引用的两个经典问题是运行总计和装箱。
对于我在上一份工作中继承的设计不佳的流程,我使用了基于集合的迭代方法并取得了成功。简而言之,有一个过程每年必须更新 50-75M 行,而尝试在一个集合中这样做会破坏我们的日志。通过将更新分块为 N 行的较小批次,它允许日志跟上并且实际上完成速度比上一年他们刚刚分配了 1 公吨多的磁盘空间时更快。
当某些事情无法完成时。
流血当然很明显。但请注意,“不基于集合”和使用程序解决方案的人存在差异,因为他们不理解集合或不知道如何使用基于集合的代码来实现。
程序代码的一个示例是每行发送一封电子邮件,每行具有不同的内容
很多供 DBA 使用的 SQL 代码是过程性的。例如,在数据库和表上循环(CURSOR 或 WHILE:没有区别)以重建索引和更新统计信息。
一些 SQL 构造允许在集合的上下文中逐行处理,例如 CROSS APPLY 像这样在 SO: SELECT TOP 5 rows for each FK(注意 ROW_NUMBER() 解决方案)
编辑:扩展@billinkc 的答案...
CROSS APPLY 允许使用具有“单行 API”的 UDF 进行基于集合的操作
归档时间: |
|
查看次数: |
624 次 |
最近记录: |