我想执行一个存储过程以在两个表中插入一组记录,然后,一旦所有记录都被插入,就执行另一个存储过程。从所有内容看来,这似乎应该可以正常工作,因为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中创建的数据集分别运行(此数据集通常在更多数据上运行,但工作原理相同)。
请注意,每个invoiceitemid与一个不同的invoiceid相关联。然后,我执行sproc 2并获得以下结果。
现在,所有发票中的一个都与一个发票相关联,多余的发票已被删除。另外,oldid和Combine设置为1,以避免稍后运行时在此过程中操纵这些项目。这是我想要的结果。
但是,如果我如上所述调用两个sproc,而不是分别运行,则会得到以下结果。
Data from running the sproc's sequentially in one script
请注意,发票中的发票仍与单独的发票相关联,并且所有的“ oldid”和“ combine”字段均设置为1,而不是合并为一张发票。
我能确定发生这种情况的唯一方法是,如果每次sproc 1插入一条记录时都在执行sproc2。
我真的很感激任何有关如何纠正此问题的想法,在这种情况下,我仍然可以按顺序运行两个sproc,而不必手动执行第二个sproc。