Tsql 异步SQL过程执行设置并等待完成

Tsql 异步SQL过程执行设置并等待完成,tsql,asynchronous,sql-server-2016,service-broker,Tsql,Asynchronous,Sql Server 2016,Service Broker,假设我有一大组对要运行的过程的调用,这些调用具有不同的参数,但是独立的,因此我希望进行并行/异步调用。我使用ServiceBroker来解决这些问题,但问题是我想知道如何等待它们全部完成(或出错) 有办法做到这一点吗?我相信我可以在结果表上循环等待,检查是否完成,但这不是很“事件触发”。希望有一个更好的方法来做到这一点 我使用了ServiceBroker,并根据另一个答案使用了队列代码和处理:再见,Shiv 有几种方法(像往常一样)可以用来实现这个需求。其中之一就是使用这种逻辑: (1) 创建两

假设我有一大组对要运行的过程的调用,这些调用具有不同的参数,但是独立的,因此我希望进行并行/异步调用。我使用ServiceBroker来解决这些问题,但问题是我想知道如何等待它们全部完成(或出错)

有办法做到这一点吗?我相信我可以在结果表上循环等待,检查是否完成,但这不是很“事件触发”。希望有一个更好的方法来做到这一点

我使用了ServiceBroker,并根据另一个答案使用了队列代码和处理:

再见,Shiv

有几种方法(像往常一样)可以用来实现这个需求。其中之一就是使用这种逻辑:

(1) 创建两个队列:一个是触发器,用于执行您希望异步执行的主SP,另一个是触发器,用于在所有执行结束后执行您希望执行的任何内容

(2) 当您在第一个队列中创建消息时,您还应该在第二个队列中创建一条消息,该消息只会告诉我们哪些执行尚未结束(第一个队列提供了从我们开始执行后开始执行的信息,我们使用该消息并将其从队列中删除)

(3) 在使用第一个主队列执行的SP内(此部分以同步方式执行):

(3.1)执行您需要的查询

(3.2)清除第二个队列中的等效消息(意味着只有在查询结束后才会删除此消息)

(3.3)检查第二个队列中是否有消息。如果没有消息,那么所有任务都将结束,您可以执行最后一步


**从理论上讲,您可以在表中存储数据,而不是使用第二个队列,但使用第二个队列可能会提供比每次执行结束时更新表更好的性能。无论如何,您也可以测试使用表的选项。

>(3.3)检查第二个队列中是否有消息。如果没有消息,那么所有任务都将结束,您可以执行最后一步,当您这样说时,这是我的问题的核心-您用于此检查的机制?在上面的逻辑中,您检查由第一个主队列触发的同一存储过程(SP)中的第二个队列。它是包含主查询的事务的一部分(这就是为什么步骤3.1-3.3不是新步骤,而是步骤3的一部分)。根据您的描述,我假设您知道如何使用队列和消息,因为您描述了您知道如何使用ServiceBroker异步执行查询。您的意思是说您不知道如何检查队列是否为空,或者您是否还不清楚逻辑?我想我了解工作流是什么。(3.3)听起来像是一个潜在的竞争条件-如果说最后两个队列项目同时完成,那么可能会多次处理“最后一步”?另一个问题是我希望主线程继续,而不是从第二个队列处理器继续主脚本执行。关于第一点,这是您应该在最后一步中介绍的内容。例如,如果在最后一步中创建表,则首先检查表是否存在。你们并没有给我们提供任何真实的信息,只提供了故事,这只会导致一般的理论讨论!如果您想要特定的解决方案,那么我们需要重现相关的场景,这意味着您需要提供查询来创建所有相关元素(表、插入示例数据、当前服务代理、消息类型、契约等)……看起来您得到了理论解决,并且理解了步骤