首页 > 解决方案 > SQL Server“快捷方式”处理

问题描述

这是我要解决的问题的简化版本。

我有一个#MyData包含 2 列的临时表:descriptionvalue.

我还有表MyRuleSequenceCollectionMyRuleSequenceMyRule,我想用它们来评估临时表中的数据。 MyRuleSequence是记录的有序列表MyRule,并且MyRuleSequenceCollection是记录的无序集合MyRuleSequence

其中一个序列在临时表中查找描述为“A”和“B”的记录,然后尝试将 A 除以 B。第一条规则测试 A 的存在,如果不存在,则该过程应该停止。第二条规则测试 B 的存在,如果它不存在,则该过程应该停止。第三条规则测试 B 不为 0,如果为 0,则停止进程。最后,第 4 条规则将 A 除以 B,并测试结果是否大于 1。

临时表包含:

一个 20
乙 5

结果:评估所有 4 条规则,最终结果true

临时表包含:

一个 20
0

结果:只运行前 3 条规则,没有除以 0 错误,最终结果false

临时表包含:

乙 20
C 5

结果:只运行第一条规则,最终结果为假

我能看到的唯一设计方法是使用游标,或者更糟糕的是,使用动态 SQL。

所以我正在寻找设计建议。考虑以上只是一个例子(许多情况要复杂得多),这个过程是否可以设计为避免游标或动态SQL?递归可以解决吗?

更新:几天没有任何建议或意见。有人对此使用 CTE 有意见吗?或者这只是一个为您处理释放的游标?

标签: sql-serverdatabase-cursor

解决方案


有时,除了使用数据库游标之外,确实没有其他有效的选择。

这就是我所做的。它可以工作,并且性能和资源使用是合理的。这是一个只有本地静态的消防软管,没有锁定我能想到的所有其他东西来加速游标,如果我以后遇到性能问题,我可以子集几个连接/别名表(3 个表被连接/别名 10 次)进入一个表变量并在游标中使用它来进一步加快它。

我想知道为什么对光标的自动厌恶如此强烈,即使在没有实用替代方案的情况下也是如此。


推荐阅读