2011-10-20 40 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

他试图杀死正在进行的查询,而不是一个进程。 –