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

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

MSDN说:

如果没有什么可以取消,则不会发生任何事情 但是,如果正在处理命令,并且尝试取消失败,则不会生成exception。

  • Cmd – SqlCommand
  • DA – DataAdapter
  • Conn – SqlConnection
  • CurrentSearch – 线程
  • 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取消这么长的查询?

如果你真的想要杀死它,这个方法很好用:

  • 通过在同一连接上调用SELECT @@SPID AS 'SESSIONID' ,在开始长时间运行的查询之前存储会话ID

当你想要杀死它时:

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

是的,你可以从.NET中删除一个进程。 这是一个例子 。 请注意,您需要适当的权限,并且必须弄清楚相关流程。 我没有快速确定您的查询在哪个进程下运行的示例。

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