我正在建立一个功能,一旦任何标有针对它的购买发票被取消,就会返回销售发票的净值 - 这些成本中的一部分是承包商成本,我们也想要计算NI或一组增加向承包商支付费用以反映“真实”价值。
因此,在一张销售发票上,我们可能有几个承包商,我们有购买发票,有些可能在NI计算为13.8%,其他可能在标准“提升”10%,其他可能在0 %添加。
我想弄清楚的是,如果我需要将整个功能作为游标,因为每个购买发票的变量都会有不同的数字 例如
(SELECT SUM(th.hoursworked * (th.payrate * (1 + (@NIAMOUNT / 100))) )
但@NIAMOUNT必须更改每张购买发票。
这是通过游标执行此操作的最佳方式,还是有更好的方法来执行此操作?
对不起,如果这有点冗长!
答案 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))))