可以真正取消/杀死sql server查询吗?

时间:2011-10-20 14:47:46

标签: c# sql-server

我想让用户能够取消正在运行的查询。查询真的很慢。 (查询优化除此之外。)这主要是出于好奇。

MSDN说:

  

如果没有要取消的内容,则不会发生任何事情。但是,如果有的话   正在进行的命令,并且尝试取消失败,没有例外   生成。

  • Cmd - SqlCommand
  • DA - DataAdapter
  • Conn - SqlConnection
  • CurrentSearch - Thread
  • LongQuery - Singleton

这就是我所拥有的:

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取消这么长的查询?

2 个答案:

答案 0 :(得分:9)

如果你真的绝对想要杀死它,那么这种方法很好:

当你想要杀死它时:

  • 打开新的数据库连接
  • 为该会话ID发出KILL命令 请注意,MSDN文档声明您需要权限ALTER ANY CONNECTION才能执行此操作

答案 1 :(得分:-2)

是的,您可以从.NET中删除进程。 Here is an example。请注意,您需要适当的权限,并且必须弄清楚相关流程。我没有快速确定您的查询运行过程的示例。

您的示例中止了该线程,但这并不意味着SQL Server上的工作已终止。如果你这样思考:当你经历一个糟糕的细胞区并且电话掉线时,如果你妈妈/妻子/朋友正在喋喋不休,他们会立即停止说话吗?这是中止线程的类比,至少在使用数据库服务器的情况下。