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

T-SQL:在特定时间后停止查询,sql,tsql,Sql,Tsql,我希望在t-SQL(MS SQL SMS)中运行一个查询,该查询将在X秒后停止。比如说30秒。我的目标是在6分钟后停止查询。我知道这个问题不正确,但我想给你一个想法 Select * from DB_Table where (gatedate()+datepart(seconds,'00:00:30')) < getdate() 从DB_表中选择* 其中(gatedate()+datepart(秒,'00:00:30'))

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

Select * from DB_Table
where (gatedate()+datepart(seconds,'00:00:30')) < getdate()
从DB_表中选择*
其中(gatedate()+datepart(秒,'00:00:30'))
您将使用什么来执行此查询?如果创建.NET应用程序,则存储过程的超时时间为30秒。如果愿意,可以通过更改
SqlCommand将超时更改为6分钟。CommandTimeout

在SQL Server Management Studio中,打开选项对话框(工具..选项)。深入到“查询执行/SQL Server/General”。您应该看到如下内容:

执行超时设置是您想要的。值为0指定无限的超时。正值表示超时限制(以秒为单位)

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

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

是的,让我们试试看

这是一个将运行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 
声明@i INT=1;

WHILE(@i)我从未在任何SQL语句中见过类似的情况。您最好的选择可能是让一个进程调用另一个运行查询的进程,然后在等待6分钟后杀死第二个进程。
-- 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)