【问题标题】:T-SQL: Stop query after certain timeT-SQL:在一定时间后停止查询
【发布时间】:2011-10-04 20:52:24
【问题描述】:

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

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

【问题讨论】:

  • 我从未在任何 SQL 语句中看到过类似的情况。您最好的选择可能是让一个进程调用运行查询的第二个进程,然后在等待 6 分钟后终止第二个进程。

标签: sql tsql


【解决方案1】:

在 SQL Server Management Studio 中,打开选项对话框 (Tools..Options)。向下钻取到“查询执行/SQL Server/常规”。您应该会看到如下内容:

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

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

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

【讨论】:

    【解决方案2】:

    是的,让我们试试吧。

    这是一个将运行 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 = 您希望作业运行的最大分钟数

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在 SQL Server 中,我只需右键单击左侧Object Explorer 窗格中的连接,选择Activity Monitor,然后选择Processes,右键单击正在运行的查询,然后选择Kill Process

        【讨论】:

          猜你喜欢
          • 2011-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-19
          • 1970-01-01
          • 2011-09-25
          • 1970-01-01
          • 2019-04-20
          相关资源
          最近更新 更多