带有大小写的大型更新语句和每种情况下的多个插入/更新

时间:2013-06-07 18:20:16

标签: sql-server loops case procedure

我不知道怎么问这个问题,但是这里有。我正在尝试编写一个程序来运行每晚检查业务的所有未付发票,然后在需要时添加服务费。我需要查询未付款的发票,然后在创建和当前日期之间检查datediff(),然后在某些值(如15或30天)我需要对其他表进行多次插入和更新以添加服务费和更新余额。从我读到的循环不是要走的路,但我不知道如何跟踪当前发票或如何在大型更新声明中进行插入。这是我需要的一些伪代码

select * from invoice where ispaid = 0

set days = currentdate - invoicecreationdate

switch (days)

case 30

insert servicecharge
update invoice
update balance

case 60

insert servicecharge
update invoice
update balance due

case 90

insert servicecharge
update invoice
update balance

我知道这不是很多,但我会接受任何帮助。我不确定如果没有循环,这是如何工作的,因为我在每个案例中都有几个语句需要知道我们当前正在处理的发票

1 个答案:

答案 0 :(得分:0)

在你的情况下,循环不会那么糟糕。每次遍历循环都会在“过期”窗口中添加30天,看起来您打算将每个窗口的所有适用行作为一组进行处理。那是好事。

或者,您可以使用类似的内容生成适当的日期范围:

declare @Today as Date = GetDate();

select DateAdd( day, -( AgingDays + 30 ), @Today ) as StartDate,
  DateAdd( day, -( AgingDays + 1 ), @Today ) as EndDate, PenaltyPercent
  from ( values ( 30, 2 ), ( 60, 5 ), ( 90, 10 ) ) as PastDueIntervals( AgingDays, PenaltyPercent )

可以轻松扩展以携带每个范围的附加数据。通过将此加入您的Invoice表,您可以一次处理所有适用的发票。

根据表的大小,生成包含发票ID,逾期间隔和任何其他适用数据的临时表可能是有意义的。然后,该表可用于提供用于更新所有三个表的信息。

一个有用的技巧是在CASE语句中加入UPDATE,例如:

update I
  set WatchList = case when Aging >= 60 then 1 else WatchList end,
    ...
  from Invoices as I inner join
    #PastDueInvoices as PDI on PDI.InvoiceId = I.InvoiceId

如果临时表显示发票超过60天或更长时间,则会设置监视列表标志,否则保持不变。