SQL 服务器 "shortcut" 处理中
SQL Server "shortcut" processing
这是我要解决的问题的简化版本。
我有一个临时 table #MyData
,其中包含 2 列:description
和 value
。
我还有 tables MyRuleSequenceCollection
、MyRuleSequence
和 MyRule
,我想用它们来评估临时 table 中的数据. MyRuleSequence
是 MyRule
条记录的有序列表,MyRuleSequenceCollection
是 MyRuleSequence
条记录的无序集合。
其中一个序列在临时 table 中查找描述为 "A" 和 "B" 的记录,然后尝试将 A 除以 B。第一个规则测试是否存在A,如果它不存在,该过程应该停止。第二条规则测试 B 是否存在,如果不存在,则该过程应停止。第三条规则测试 B 不为 0,如果为 0,进程应该停止。最后,第4条规则用A除以B,判断结果是否大于1。
临时 table 包含:
A 20
B 5
结果:所有 4 条规则均已评估,最终结果 true
临时 table 包含:
A 20
B 0
结果:只有前 3 个规则 运行,没有除以 0 的错误,最终结果 false
临时 table 包含:
B 20
C 5
结果:只有第一条规则运行s,最终结果为假
我能看到的唯一设计方法是使用游标,或者更糟的是,使用动态 SQL。
所以我正在寻找设计建议。考虑以上只是一个例子(很多情况要复杂得多),这个过程是否可以设计成避免游标或动态SQL?递归可以解决吗?
更新:几天没有任何建议或输入。有人对为此使用 CTE 有意见吗?或者这只是一个为您处理了解除分配的游标?
有时,除了使用数据库游标之外,确实没有其他有效的选择。
这就是我所做的。它可以工作,并且性能和资源使用是合理的。这是一个仅本地静态的 firehose 转发,没有锁定我能想到的所有其他加速游标的东西,如果我以后遇到性能问题,我可以子集几个 joined/aliased tables (3 tables 被保留 joined/aliased 10 次)到一个 table 变量中,并在游标中使用它来进一步加速它。
我想知道为什么对游标的自动厌恶如此强烈,即使在没有实用替代品的情况下也是如此。
这是我要解决的问题的简化版本。
我有一个临时 table #MyData
,其中包含 2 列:description
和 value
。
我还有 tables MyRuleSequenceCollection
、MyRuleSequence
和 MyRule
,我想用它们来评估临时 table 中的数据. MyRuleSequence
是 MyRule
条记录的有序列表,MyRuleSequenceCollection
是 MyRuleSequence
条记录的无序集合。
其中一个序列在临时 table 中查找描述为 "A" 和 "B" 的记录,然后尝试将 A 除以 B。第一个规则测试是否存在A,如果它不存在,该过程应该停止。第二条规则测试 B 是否存在,如果不存在,则该过程应停止。第三条规则测试 B 不为 0,如果为 0,进程应该停止。最后,第4条规则用A除以B,判断结果是否大于1。
临时 table 包含:
A 20 B 5
结果:所有 4 条规则均已评估,最终结果 true
临时 table 包含:
A 20 B 0
结果:只有前 3 个规则 运行,没有除以 0 的错误,最终结果 false
临时 table 包含:
B 20 C 5
结果:只有第一条规则运行s,最终结果为假
我能看到的唯一设计方法是使用游标,或者更糟的是,使用动态 SQL。
所以我正在寻找设计建议。考虑以上只是一个例子(很多情况要复杂得多),这个过程是否可以设计成避免游标或动态SQL?递归可以解决吗?
更新:几天没有任何建议或输入。有人对为此使用 CTE 有意见吗?或者这只是一个为您处理了解除分配的游标?
有时,除了使用数据库游标之外,确实没有其他有效的选择。
这就是我所做的。它可以工作,并且性能和资源使用是合理的。这是一个仅本地静态的 firehose 转发,没有锁定我能想到的所有其他加速游标的东西,如果我以后遇到性能问题,我可以子集几个 joined/aliased tables (3 tables 被保留 joined/aliased 10 次)到一个 table 变量中,并在游标中使用它来进一步加速它。
我想知道为什么对游标的自动厌恶如此强烈,即使在没有实用替代品的情况下也是如此。