我该如何做,以便第二个存储过程直到第一个存储过程完成后才能运行?

时间:2019-12-21 04:51:22

标签: sql-server stored-procedures

我想执行一个存储过程以在两个表中插入一组记录,然后,一旦所有记录都被插入,就执行另一个存储过程。从所有内容看来,这似乎应该可以正常工作,因为sproc应该顺序并异步运行。但是,我的结果似乎不同。

如果我执行第一个程序,然后手动执行第二个程序。我得到想要的结果。但是,如果我按如下所示在一个脚本中执行两个sproc,则会得到不同的结果集。

      Exec sp1
           @variable1 = ...
           @ariable2 = ....

      Exec sp2 (no variable passing required)

第一个步骤(为清楚起见,省略了一些更新步骤)

ALTER proc [dbo].[GenerateARInvoiceOriginalBU]
  @workorderid int
 ,@clientpo varchar(50) 
 ,@invoicenumber varchar(15)
 ,@invoicedate date
 ,@accountingdate date
as begin

-- insert invoice ----------
insert invoices(customer,job,invoicedate,accountingdate,invoicenumber,isquote,quoteexpiry,description,pretax,tax,posted)
select j.jarcust,j.job,@invoicedate,@accountingdate,@invoicenumber,0,null,'',0,0,0 
from workorders w
join jobs j on w.job=j.job
where w.workorderid=@workorderid

-- insert invoice items ----------   
insert invoiceitems
(invoiceid,workorderid,workorderdescription,extra,extradescription,itemid,itemdescription,clientpo
,qty,price,uom,pretax,tax,taxgroup,taxrate,costcode,revenueaccount,holdbackpcnt
,billedqty,billedpretax,billedpercent,contractqty,contractprice,contractpretax)
select ident_current('invoices') invoiceid,e.workorderid,w.description workorderdesc,e.extra,e.description extradesc,0 itemid,e.description itemdesc,e.clientpo
      ,e.qty
      ,e.price,'' uom
      ,e.pretax 
      ,e.tax
      ,e.taxgroup,e.taxrate,e.costcode,e.revenueaccount,e.holdbackpcnt
      ,e.qtybilled,e.pretaxbilled,0 billedpercent,e.qty,e.price,e.pretax
  from workorders w
      inner join workorderextras e on (w.workorderid=e.workorderid)
where ISNULL(e.costcode,'')<>''
  and ISNULL(e.pretax,0)<>0
  and ISNULL(e.pretaxbilled,0)=0
  and w.workorderid=@workorderid
  and ISNULL(e.clientpo,'')=ISNULL(@ClientPO,'')
union all
select ident_current('invoices'),i.workorderid,max(w.description) workorderdesc,i.extra,max(e.description) extradesc,i.itemid,i.description itemdesc,i.clientpo
      ,e.qty*i.qty qty
      ,i.price,i.uom
      ,i.pretax
      ,i.tax
      ,i.taxgroup,i.taxrate,i.costcode,i.revenueaccount,i.holdbackpcnt
      ,i.qtybilled,i.pretaxbilled,0 billedpercent,e.qty*i.qty,i.price,i.pretax
  from workorders w
      inner join workorderextras e on (w.workorderid=e.workorderid)
      inner join workorderitems i on (e.workorderid=i.workorderid and e.extra=i.extra)
      left outer join completedtasks ct on i.workorderid=ct.workorderid and i.taskcode=ct.taskcode
where (ISNULL(i.taskcode,'')='' or ISNULL(ct.taskcode,'')<>'')
  and ISNULL(e.costcode,'')=''
  and ISNULL(i.pretax,0)<>0
  and ISNULL(i.pretaxbilled,0)=0
  and w.workorderid=@workorderid
  and ISNULL(i.clientpo,'')=ISNULL(@ClientPO,'')
group by w.arcustomer,i.workorderid,i.extra,i.itemid,i.description,i.clientpo,e.qty*i.qty,i.qtybilled,i.pretax,i.tax,i.pretaxbilled,i.taxgroup,i.taxrate,i.costcode,i.revenueaccount,i.holdbackpcnt,i.price,i.uom
order by 1,2,5

-- set invoice amount ---------- 
update invoices 
set pretax= (select sum(pretax) from invoiceitems where invoiceid=ident_current('invoices'))
   ,tax   = (select sum(tax) from invoiceitems where invoiceid=ident_current('invoices'))
from invoices
where invoiceid=ident_current('invoices')

第二步

ALTER proc [dbo].[Generate_AR_Invoice_Combine]
as 
begin

update invoices set pretax=a.Pretax, tax=a.tax, oldid=1 from
CombineInvoices a where invoices.invoiceid=a.invoiceid
;
update invoiceitems
set invoiceid = cimi.mininvoiceid
from invoiceitems ii 
join combineinvoiceitems cii on ii.InvoiceItemID = cii.invoiceitemid
join dbo.combine_inv_items_min_invoice cimi on cii.job = cimi.job
--;
update invoices 
set combine=1 where isnull(combine,0) = '0' and oldid = '1'
;
delete from invoices where isnull(combine,0)=0 and isnull(oldid,0)=0
end

这是第二个过程中使用的视图。

ALTER VIEW [dbo].[CombineInvoices]
AS
SELECT        MIN(i.InvoiceID) AS InvoiceID, MIN(i.InvoiceNumber) AS InvoiceNumber, i.Job, dbo.Combine_Inv_Items_Sums.Pretax, dbo.Combine_Inv_Items_Sums.Tax
FROM            dbo.Invoices AS i INNER JOIN
                         dbo.Combine_Inv_Items_Sums ON i.Job = dbo.Combine_Inv_Items_Sums.Job
WHERE        (ISNULL(i.Combine, 0) = 0)
GROUP BY i.Job, dbo.Combine_Inv_Items_Sums.Pretax, dbo.Combine_Inv_Items_Sums.Tax

ALTER VIEW [dbo].[CombineInvoiceItems]
AS
SELECT        i.Job, ii.InvoiceItemID, i.InvoiceNumber, i.InvoiceID
FROM            dbo.Invoices AS i INNER JOIN
                         dbo.InvoiceItems AS ii ON i.InvoiceID = ii.InvoiceID
WHERE        (ISNULL(i.Combine, '') = 0)
GROUP BY i.Job, ii.InvoiceItemID, i.InvoiceNumber, i.InvoiceID

ALTER VIEW [dbo].[Combine_Inv_Items_Sums]
AS
SELECT        cii.Job, ROUND(SUM(ii.Pretax), 2) AS Pretax, ROUND(SUM(ii.Tax), 2) AS Tax
FROM            dbo.CombineInvoiceItems AS cii INNER JOIN
                         dbo.InvoiceItems AS ii ON cii.InvoiceItemID = ii.InvoiceItemID
GROUP BY cii.Job

ALTER VIEW [dbo].[Combine_Inv_Items_Min_Invoice]
AS
SELECT        MIN(InvoiceID) AS MinInvoiceid, Job
FROM            dbo.CombineInvoiceItems
GROUP BY Job

在一个简单的示例中,这是在两个sproc中创建的数据集分别运行(此数据集通常在更多数据上运行,但工作原理相同)。

Data from sproc 1

请注意,每个invoiceitemid与一个不同的invoiceid相关联。然后,我执行sproc 2并获得以下结果。

Data from sproc 2

现在,所有发票中的一个都与一个发票相关联,多余的发票已被删除。另外,oldid和Combine设置为1,以避免稍后运行时在此过程中操纵这些项目。这是我想要的结果。

但是,如果我如上所述调用两个sproc,而不是分别运行,则会得到以下结果。

Data from running the sproc's sequentially in one script

请注意,发票中的发票仍与单独的发票相关联,并且所有的“ oldid”和“ combine”字段均设置为1,而不是合并为一张发票。

我能确定发生这种情况的唯一方法是,如果每次sproc 1插入一条记录时都在执行sproc2。

我真的很感激任何有关如何纠正此问题的想法,在这种情况下,我仍然可以按顺序运行两个sproc,而不必手动执行第二个sproc。

0 个答案:

没有答案