2011-10-20 76 views
13

我想讓用戶能夠取消正在運行的查詢。查詢非常慢。 (查詢優化不僅僅是重點。)這主要是出於我的好奇。SQL服務器查詢可以真正取消/殺死嗎?

MSDN說:

如果沒有要取消,沒有什麼發生。但是,如果有正在執行的命令 ,並且取消嘗試失敗,則不會生成例外情況 。

  • Cmd的 - 的SqlCommand
  • DA - DataAdapter的
  • 康涅狄格州 - 的SqlConnection
  • CurrentSearch - 螺紋
  • LongQuery - 辛格爾頓

這是我有:

var t = new Thread(AbortThread); 
t.Start(); 

void AbortThread() 
{ 
    LongQuery.Current.Cmd.Cancel(); 
    LongQuery.Current.Cmd.Dispose(); 
    LongQuery.Current.DA.Dispose(); 
    LongQuery.Current.Conn.Close(); 
    LongQuery.Current.Conn.Dispose(); 
    LongQuery.Current.Cmd = null; 
    LongQuery.Current.DA = null; 
    LongQuery.Current.Conn = null; 
    CurrentSearch.Abort(); 
    CurrentSearch.Join(); 
    CurrentSearch = null; 
} 

我注意到CurrentSearch.Abort()被阻塞,這就是爲什麼我將它包裝在一個線程中,這可能意味着該線程仍在工作。

最後,還有什麼比這我可以做取消查詢?實際上可以從.NET中取消這麼長的查詢嗎?

+1

是查詢寫入數據,或只是讀了嗎? –

+0

@BrianKnight只需閱讀多個視圖。 – Candide

回答

9

如果你真的絕對要殺死它很好地利用這種方法:對通過相同的連接上調用SELECT @@SPID AS 'SESSIONID'開始長時間運行的查詢之前

  • 店走的會話ID

當你想殺死它:

  • 打開一個新的數據庫連接
  • 問題對於會話ID
    一個KILL命令當心爲MSDN文檔指出你所需要的權限ALTER ANY CONNECTION做到這一點
+3

KILL命令需要提升權限 - 修改任何連接。 –

+0

是真實的 - 但它是AFAIK唯一的100%解決方案... – Yahia

+0

太棒了!那樣做了。謝謝你啊! – Candide

-2

是的,你可以殺死一個.NET的進程。 Here is an example。請注意,您將需要適當的權限,並且您必須找出有問題的過程。我沒有快速確定您的查詢在哪個進程下運行。

您的示例中止了該線程,但這並不意味着SQL Server上的工作已終止。如果你這樣想:當你經歷一個糟糕的小區時,呼叫會下降,如果你媽媽/妻子/朋友在嗡嗡作響,他們是否會立即停止交談?這是中止線程的類比,至少在使用數據庫服務器的情況下。

+5

他試圖殺死正在進行的查詢,而不是一個進程。 –