0

目前,我需要创建一个报告程序,该程序在 SQL 数据库中的许多不同表上运行报告。多个不同的客户端需要此功能,但某些客户端的数据库比其他客户端大。我想知道的是,如果查询时间“太长”,是否可以在一段时间后停止查询。

给出一些上下文,一些客户端的表超过 200 万行,尽管不同的客户端在同一个表中可能只有 50k 行。我希望能够运行查询 20 秒,如果它还没有完成,那么向用户返回一条消息,说结果集太大并且需要像我们一样在几个小时之外生成报告不想在白天运行资源密集型操作。

4

2 回答 2

5

在您的连接字符串或DataContext通过CommandTimeout属性设置连接超时。当超时到期时,您将获得一个TimeoutException,并且您的查询将被取消。

您不能确定在超时发生的那一刻服务器上的查询就被取消了,但在大多数情况下,它会很快取消。有关详细信息,请阅读出色的文章“没有查询超时之类的东西......”。重要的部分是:

客户端使用注意事件向服务器发送查询超时信号。注意事件只是 SQL Server 客户端可以发送给它的一种不同类型的 TDS 数据包。除了连接/断开连接、T-SQL 批处理和 RPC 事件之外,客户端还可以向服务器发出注意信号。注意告诉服务器尽快取消连接当前正在执行的查询(如果有的话)。注意不会回滚打开的事务,也不会立即停止当前正在执行的查询——服务器会在下一个可用机会时中止它为连接所做的一切。通常,这会很快发生,但并非总是如此。

但请记住,它会因提供商而异,甚至可能会在服务器版本之间发生变化。

于 2012-09-11T20:03:16.867 回答
0

如果您在后台线程上运行查询,您可以轻松地做到这一点。让主线程启动一个计时器并生成一个运行查询的后台线程。如果超过 20 秒后台线程没有返回结果,主线程可以取消它。

于 2012-09-11T20:03:32.730 回答