我正在做这样的事情:
exec up_sp1 -- executing this stored procedure which populates the table sqlcmds
---Check the count of the table sqlcmds,
---if the count is zero then execute up_sp2,
----otherwise wait till the count becomes zero,then exec up_sp2
IF NOT EXISTS ( SELECT 1 FROM [YesMailReplication].[dbo].[SQLCmds])
BEGIN
exec up_sp2
END
正确的t-sql会是什么样的?
答案 0 :(得分:2)
除Service Broker队列外,T-SQL没有WAITFOR语义。因此,除了使用Service Broker之外,您所能做的就是定期轮询并查看该表是否已填充。对于小规模,这种方法很好,但是对于大规模而言,它很难打破,因为很难实现等待时间和轮询频率之间的正确平衡,并且更难以使其适应尖峰和低点。
但是如果您愿意使用Service Broker,那么您可以通过利用Activation来做更优雅和可扩展的解决方案:up_sp1
将消息放入队列,此消息激活队列过程在up_sp1提交后,依次启动并启动up_sp2
。这是一种可靠的机制,可以处理服务器重新启动,镜像和群集故障转移,甚至可以从备份重建服务器。有关实现非常相似的示例,请参阅Asynchronous procedure execution。
答案 1 :(得分:1)
试试这个:
DECLARE @Count int
SELECT @Count = COUNT(*) FROM [YesMailReplication].[dbo].[SQLCmds])
IF @Count > 0 BEGIN
exec up_sp2
END
答案 2 :(得分:1)
Service Broker解决方案肯定是最好的 - 但也有一个WAITFOR解决方案:
exec up_sp1;
while exists (select * from [YesMailReplication].[dbo].[SQLCmds]) begin
waitfor delay ('00:00:10'); -- wait for 10 seconds
end;
exec up_sp2;
答案 3 :(得分:0)
为什么不保持简单和自我记录?
DECLARE @Count int;
SELECT @Count = Count(*) FROM [YesMailReplication].[dbo].[SQLCmds]
If @Count = 0 exec up_sp2