sql server查询真的可以取消/终止吗?

本文关键字:终止 取消 server 查询 真的 sql | 更新日期: 2023-09-27 18:12:06

我想让用户能够取消正在运行的查询。查询非常慢。(查询优化不是重点。)这主要是出于我的好奇心。

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

sql server查询真的可以取消/终止吗?

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

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

当你想杀死它时:

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

是的,你可以从。net杀死一个进程。这里有一个例子。请注意,您将需要适当的许可,您必须找出问题的过程。我没有一个快速的示例来确定您的查询在哪个进程下运行。

你的例子终止线程,但这并不意味着SQL Server上的工作被终止。如果你这样想:当你经过一个信号不好的区域时,如果你的妈妈/妻子/朋友正在唠叨,他们会立即停止说话吗?这类似于终止线程,至少在使用数据库服务器的情况下是这样。