Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我如何使第二次存储过程不会';在第一次存储过程完成之前是否运行?_Sql Server_Stored Procedures - Fatal编程技术网

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