在表更新触发器异步后从SQL Server运行控制台应用程序?

时间:2011-12-27 18:35:10

标签: sql sql-server xp-cmdshell

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

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

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

我正在使用SQL Server 2008

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

感谢大家的帮助。

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我建议使用CLR程序,因为它可以让您更好地控制该过程。但是可以使用xp_cmdshell执行此操作。

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