我希望在t-SQL(MS SQL SMS)中运行一个在X秒后停止的查询。说30秒。我的目标是在6分钟后停止查询。我知道查询不正确,但想给你一个想法。
Select * from DB_Table
where (gatedate()+datepart(seconds,'00:00:30')) < getdate()
答案 0 :(得分:3)
在SQL Server Management Studio中,打开选项对话框(Tools..Options)。深入查看“Query Execution / SQL Server / General”。你应该看到这样的东西:
执行超时设置是您想要的。值0指定无限超时。一个正值,以秒为单位的超时限制。
注意:此值“是命令执行或处理结果期间所有网络读取的累计超时。在返回第一行后仍会发生超时,并且不包括用户处理时间,只包括网络读取时间。“ (根据MSDN)。
如果您使用的是ADO.Net(System.Data.SqlClient),则可以使用SqlCommand对象的CommandTimeout属性。连接字符串超时动词:Connect Timeout
,Connection Timeout
或Timeout
指定与SQL Server建立连接时等待的时间。它与查询执行无关。
答案 1 :(得分:1)
您将使用什么来执行此查询?如果创建.NET应用程序,则default的存储过程超时为30秒。如果您愿意,可以通过更改SqlCommand.CommandTimeout
答案 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
= 您希望作业运行的最大分钟数