2010-11-16 65 views
0

我做這樣的事情:如果NOT EXISTS邏輯

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的樣子是否正確?

回答

1

服務代理的解決方案無疑是最好的 - 但有一個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; 
1

試試這個:

DECLARE @Count int 
SELECT @Count = COUNT(*) FROM [YesMailReplication].[dbo].[SQLCmds]) 

IF @Count > 0 BEGIN 

exec up_sp2 

END 
2

T-SQL沒有WAITFOR語義除了Service Broker的隊列。因此,您只需使用Service Broker即可定期輪詢並查看該表是否已填充。對於小規模的企業來說,這樣做很好,但是對於高規模而言,由於等待時間和輪詢頻率之間的平衡難以實現,因此更難以適應尖峯和低谷。

但如果你願意使用服務代理,那麼你可以通過利用Activation做的更優雅和可擴展的解決方案:up_sp1下降的消息到隊列中,該消息激活啓動,進而啓動up_sp2排隊過程中,在up_sp1提交之後。這是一種可靠的機制,可以處理服務器重新啓動,鏡像和集羣故障切換,甚至可以通過備份重建服務器。請參閱Asynchronous procedure execution以獲得非常相似的示例。

0

爲什麼不簡單和自我記錄?

DECLARE @Count int; 

SELECT @Count = Count(*) FROM [YesMailReplication].[dbo].[SQLCmds] 
If @Count = 0 exec up_sp2 
+2

我看到,安倍晉三發表他的反應,而我在寫我的... – Flipster 2010-11-16 23:55:55