SQL 2008游标需要吗?

时间:2012-08-29 09:48:44

标签: sql sql-server sql-server-2008 cursor

我正在建立一个功能,一旦任何标有针对它的购买发票被取消,就会返回销售发票的净值 - 这些成本中的一部分是承包商成本,我们也想要计算NI或一组增加向承包商支付费用以反映“真实”价值。

因此,在一张销售发票上,我们可能有几个承包商,我们有购买发票,有些可能在NI计算为13.8%,其他可能在标准“提升”10%,其他可能在0 %添加。

我想弄清楚的是,如果我需要将整个功能作为游标,因为每个购买发票的变量都会有不同的数字 例如

(SELECT SUM(th.hoursworked * (th.payrate * (1 + (@NIAMOUNT / 100))) ) 

但@NIAMOUNT必须更改每张购买发票。

这是通过游标执行此操作的最佳方式,还是有更好的方法来执行此操作?

对不起,如果这有点冗长!

2 个答案:

答案 0 :(得分:2)

你几乎肯定不需要光标

将您的工作时间加入到他们所依据的合同中,并从合同中获取NI值。

答案 1 :(得分:2)

你应该尽可能避免使用游标 - 游标“串行”运行会限制SQL的性能。

如果计算很简单,一种方法是做内联的NI查询,例如。

(SELECT SUM(th.hoursworked * (th.payrate * (1 + 
                                           ((CASE somejoinedtable.UpliftType 
                                                  WHEN 1 THEN 10
                                                  WHEN 2 THEN 13.8
                                                  WHEN 3 THEN 0
                                             END
                                        / 100)))) 

如果内联过于混乱,您可以抽象出用户定义的函数

CREATE FUNCTION dbo.fnGetNIAmount(int @someLookupParam)
...

然后这样做

(SELECT SUM(th.hoursworked * (th.payrate * (1 + 
                                           ((dbo.fnGetNIAmount(somejoinedtable.UpliftType )
                                        / 100))))