Sql server 我如何使第二次存储过程不会';在第一次存储过程完成之前是否运行?
我想执行一个存储过程,在两个表中插入一组记录,然后在插入所有记录后,执行另一个存储过程。从我所能找到的一切来看,这应该可以很好地工作,因为存储过程应该按顺序异步运行。然而,我的结果似乎有所不同 如果执行第一个存储过程,然后手动执行第二个存储过程。我得到了我想要的结果。但是,如果我在一个脚本中执行两个存储过程(如下所示),则会得到不同的结果集Sql server 我如何使第二次存储过程不会';在第一次存储过程完成之前是否运行?,sql-server,stored-procedures,Sql Server,Stored Procedures,我想执行一个存储过程,在两个表中插入一组记录,然后在插入所有记录后,执行另一个存储过程。从我所能找到的一切来看,这应该可以很好地工作,因为存储过程应该按顺序异步运行。然而,我的结果似乎有所不同 如果执行第一个存储过程,然后手动执行第二个存储过程。我得到了我想要的结果。但是,如果我在一个脚本中执行两个存储过程(如下所示),则会得到不同的结果集 Exec sp1 @variable1 = ... @ariable2 = ....
Exec sp1
@variable1 = ...
@ariable2 = ....
Exec sp2 (no variable passing required)
第一个步骤(为了清晰起见,省略了一些更新步骤)
以下是第二个过程中使用的视图
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
在一个简单的示例中,这是在两个存储过程中创建的数据集,它们分别运行(这通常运行在更多的数据上,但工作原理相同)
请注意,每个invoiceitemid都与不同的invoiceid相关联。然后执行存储过程2并得到以下结果
现在,所有invoiceitemid都与一个invoiceid关联,额外的invoiceid已被删除。此外,oldid和combine设置为1,以避免以后运行时在此过程中操纵这些项目。这就是我想要的结果
但是,如果我像上面提到的那样调用这两个存储过程,而不是单独运行,则会得到以下结果
请注意,invoiceitemid与单独的invoiceid保持关联,“oldid”和“combine”字段设置为1,而不是合并到一张发票
我能判断这种情况的唯一方法是,如果每次存储过程1插入记录时都执行存储过程2
如果您能告诉我如何更正此问题,我将不胜感激,因为我仍然可以让两个存储过程按顺序运行,而不必手动执行第二个存储过程。任何一种方法都可以。你需要提供更多的信息。第二个程序如何确定要处理的记录。这就是问题所在,而不是您调用存储过程的方式。我添加了一些进一步的信息。谢谢你的建议。我还认为它应该按原样工作。您的表上没有定义任何触发器,是吗?只是查看并找到了这两个触发器。这些是否会导致其工作方式不同?它们是由以前的程序员设置的,所以我必须检查它们的用途是否仍然适合我们的需要。如果它们确实起作用并且是必需的,我可以暂时停止它们触发吗?在[dbo].[STMP_Workorders]上更改触发器[dbo].[Workorders]以更新为更新Workorders set ModifiedDate=getdate(),从Workorders a连接插入b在a.WorkorderID=b.WorkorderID上
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