目前,我需要创建一个报告程序,该程序在SQL数据库中的许多不同表上运行报告。多个不同的客户端需要此功能,但某些客户端拥有比其他客户端更大我想知道的是,如果查询一段时间过长,是否可以在一段时间后停止查询。
为了给出一些上下文,一些客户端具有超过200万行的表,尽管不同的客户端在同一个表中可能只有50k行。我希望能够运行20秒的查询,如果还没有完成,那么向用户返回一条消息,说结果集太大了,报告需要在小时之外生成不想在白天进行资源密集型操作。
答案 0 :(得分:5)
通过CommandTimeout
property在您的连接字符串或DataContext
上设置连接超时。超时到期后,您将获得TimeoutException
,您的查询将被取消。
您无法确定在超时发生时服务器上是否取消了查询,但在大多数情况下,它会相当快地取消。有关详细信息,请阅读优秀文章"There's no such thing as a query timeout..."。其中重要的部分是:
客户端使用注意力向服务器发出查询超时信号 事件。注意事件只是一种不同类型的TDS包a SQL Server客户端可以发送给它。除了连接/断开, T-SQL批处理和RPC事件,客户端可以发出注意信号 服务器。注意告诉服务器取消连接 目前正在执行查询(如果有的话)。一个 注意不会回滚打开的交易,也不会停止 目前正在执行查询 - 服务器中止它 在下一个可用的机会做着连接。 通常,这种情况很快发生,但并非总是如此。
但请记住,它会因提供商而异,甚至可能会在服务器版本之间发生变化。
答案 1 :(得分:0)
如果在后台线程上运行查询,则可以轻松完成。使主线程启动计时器并生成运行查询的后台线程。如果20秒结束后,后台线程没有返回结果,主线程可以取消它。