T-SQL:在一定时间后停止查询

时间:2011-10-04 20:52:24

标签: sql tsql

我希望在t-SQL(MS SQL SMS)中运行一个在X秒后停止的查询。说30秒。我的目标是在6分钟后停止查询。我知道查询不正确,但想给你一个想法。

Select * from DB_Table
where (gatedate()+datepart(seconds,'00:00:30')) < getdate()

3 个答案:

答案 0 :(得分:3)

在SQL Server Management Studio中,打开选项对话框(Tools..Options)。深入查看“Query Execution / SQL Server / General”。你应该看到这样的东西:

enter image description here

执行超时设置是您想要的。值0指定无限超时。一个正值,以秒为单位的超时限制。

注意:此值“是命令执行或处理结果期间所有网络读取的累计超时。在返回第一行后仍会发生超时,并且不包括用户处理时间,只包括网络读取时间。“ (根据MSDN)。

如果您使用的是ADO.Net(System.Data.SqlClient),则可以使用SqlCommand对象的CommandTimeout属性。连接字符串超时动词:Connect TimeoutConnection TimeoutTimeout指定与SQL Server建立连接时等待的时间。它与查询执行无关。

答案 1 :(得分:1)

您将使用什么来执行此查询?如果创建.NET应用程序,则default的存储过程超时为30秒。如果您愿意,可以通过更改SqlCommand.CommandTimeout

将超时更改为6分钟

答案 2 :(得分:1)

是的,让我们试试看。

这是一个将运行 6 分钟的查询:

DECLARE @i INT = 1;
WHILE (@i <= 360)                       
BEGIN
    WAITFOR DELAY '00:00:01'            
    print FORMAT(GETDATE(),'hh:mm:ss')
    SET  @i = @i + 1;
END 

现在通过以下步骤创建一个将每 10 秒运行的代理作业:

-- Put here a part of the code you are targeting or even the whole query
DECLARE @Search_for_query NVARCHAR(300) SET @Search_for_query = '%FORMAT(GETDATE(),''hh:mm:ss'')%'
-- Define the maximum time you want the query to run
DECLARE @Time_to_run_in_minutes INT SET @Time_to_run_in_minutes = 1

DECLARE @SPID_older_than smallint
SET @SPID_older_than = (
                                    SELECT 
                                    --text,
                                    session_id
                                    --,start_time
                                    FROM sys.dm_exec_requests  
                                    CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
                                    WHERE text LIKE @Search_for_query       
                                    AND text NOT LIKE '%sys.dm_exec_sql_text(sql_handle)%'      -- This will avoid the killing job to kill itself 
                                    AND start_time < DATEADD(MINUTE, -@Time_to_run_in_minutes, GETDATE())            
                                    )

-- SELECT @SPID_older_than                                                           -- Use this for testing

DECLARE @SQL nvarchar(1000)
SET @SQL = 'KILL ' + CAST(@SPID_older_than as varchar(20))
EXEC (@SQL)

确保作业由 sa 或一些有效的替代方案运行。

现在您可以通过更改使其适应您的代码:

  • @Search_for_query = 将您要查找的查询的一部分放在这里
  • @Time_to_run_in_minutes = 您希望作业运行的最大分钟数