6

我无法找到解决问题的最佳方法,请记住,我愿意接受更好的方法来完成这项任务。

我需要做的是,在我的表中的一行值更新后,我需要使用该表中的 2 个字段作为控制台应用程序的参数。现在我可以通过在表上设置触发器然后使用xp_cmdshell参数运行应用程序来完成此操作。但是我需要异步执行此操作,以便我的存储过程在等待控制台应用程序完成时不会挂起。

也许我正在以错误的方式解决这个问题。

我正在使用 SQL Server 2008

编辑 - Andriy M 的答案似乎是目前最好的,但正如评论中所述,我需要一种方法来“立即”实现这一点。是否可以从 SP 或触发器调用作业?或者也许是另一种实现类似结果的方法?

感谢大家的帮助。

编辑 - 我在下面选择他的答案,因为它帮助我找到了更好的解决方案。我最终要做的是创建一个作业,它只针对另一个跟踪更新行的表查询我的表。然后当我有我需要更新的行时,我使用 xp_cmdshell 以指定的参数运行我的应用程序。到目前为止,该解决方案似乎运行顺利。

4

4 回答 4

5

直接从触发器运行应用程序还有另一个缺点。这与通常可以更新不止一行的事实有关。为了在您的触发器中考虑这一点,您可能必须在更新的行上组织一个循环并为每个单独运行应用程序。光标通常被认为是最后的手段,触发器中的光标更是如此。

在这种情况下,我很可能会考虑创建一个 SQL 代理作业,该作业将从由触发器填充的专用表中读取更新的值。我认为,这项工作仍然必须使用光标,但您的触发器不会,而且重点是,从工作中运行应用程序不会停止您的主要工作进程。

于 2011-12-27T19:31:37.550 回答
1

在您的触发器中,为更新的每一行将一条消息放入 Service Broker 队列中。编写一个处理队列外消息的存储过程。将存储过程设置为队列的激活存储过程。

于 2011-12-27T23:39:54.673 回答
0

我认为您应该开发一个扩展存储过程 (DLL),而不是使用 xp_cmd_shell 调用控制台应用程序。

于 2011-12-27T18:50:31.027 回答
0

我建议使用 CLR 过程,因为它可以让您更好地控制该过程。但是您可以使用xp_cmdshell.

为此,您可以编写一个批处理文件,您将使用xp_cmdshell. 在批处理文件中,使用START命令以适当的参数启动控制台应用程序。这将异步触发您的进程。批处理文件和xp_cmdshell调用将立即返回。

于 2011-12-27T19:18:13.740 回答