我无法找到解决问题的最佳方法,请记住,我愿意接受更好的方法来完成这项任务。
我需要做的是,在我的表中的行值更新后,我需要使用该表中的2个字段作为控制台应用程序的参数。现在我可以通过在表上设置触发器然后使用xp_cmdshell
来运行带有参数的应用程序来实现此目的。但是我需要异步执行此操作,因此我的存储过程在等待控制台应用程序完成时不会挂起。
也许我会以错误的方式解决这个问题。
我正在使用SQL Server 2008
编辑 - Andriy M的答案似乎是目前最好的,但正如评论中所述,我需要一种方法来“立即”实现这一点。是否可以从SP或触发器调用作业?或者可能是另一种获得类似结果的方式?
感谢大家的帮助。
编辑 - 我选择他回答如下,因为它帮助我找到了更好的解决方案。我最终做的是创建一个工作,只是查询我的表与另一个跟踪更新的行。然后,当我有我需要更新的行时,我使用xp_cmdshell运行我的应用程序与指定的参数。到目前为止,这个解决方案似乎运作顺利。
答案 0 :(得分:5)
直接从触发器运行应用程序还有另一个缺点。这与通常可以更新多行的事实有关。为了解决触发器中的问题,您可能必须在更新的行上组织循环并为每个行单独运行应用程序。游标通常被认为是最后的手段,触发游戏更是如此。
在这种情况下,我很可能会考虑创建一个SQL代理作业,该作业将从触发器填充的专用表中读取更新的值。我认为,这个工作仍然需要使用游标,但是你的触发器不会,并且重点是,从作业运行应用程序不会停止你的主要工作过程。
答案 1 :(得分:1)
在触发器中,为已更新的每一行将消息放入Service Broker队列。编写一个处理队列消息的存储过程。将存储过程设置为队列的激活存储过程。
答案 2 :(得分:0)
我认为您应该开发扩展存储过程(DLL),而不是使用xp_cmd_shell调用控制台应用程序。
答案 3 :(得分:0)
我建议使用CLR程序,因为它可以让您更好地控制该过程。但是可以使用xp_cmdshell
执行此操作。
要执行此操作,您可以编写将使用xp_cmdshell
调用的批处理文件。在批处理文件中,使用START
命令使用适当的参数启动控制台应用程序。这将异步启动您的进程。批处理文件和xp_cmdshell
调用将立即返回。