如果不存在逻辑

时间:2010-11-16 23:43:23

标签: sql-server sql-server-2005

我正在做这样的事情:

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会是什么样的?

4 个答案:

答案 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