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中取消这么长的查询吗?
如果你真的想要杀死它,使用这个方法:
- 通过在同一连接上调用
SELECT @@SPID AS 'SESSIONID'
来在开始长时间运行的查询之前存储会话ID
当你想杀死它时:
- 打开一个新的数据库连接
- 为会话ID发出
KILL
命令
注意,正如MSDN文档所述,您需要ALTER ANY CONNECTION
权限才能执行此操作
是的,你可以从。net杀死一个进程。这里有一个例子。请注意,您将需要适当的许可,您必须找出问题的过程。我没有一个快速的示例来确定您的查询在哪个进程下运行。
你的例子终止线程,但这并不意味着SQL Server上的工作被终止。如果你这样想:当你经过一个信号不好的区域时,如果你的妈妈/妻子/朋友正在唠叨,他们会立即停止说话吗?这类似于终止线程,至少在使用数据库服务器的情况下是这样。