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()
  

Комментарии:

1. Я никогда не видел ничего подобного ни в одном операторе SQL. Лучшим вариантом может быть, чтобы процесс вызывал второй процесс, который запускает запрос, а затем завершал второй процесс после ожидания 6 минут.

Ответ №1:

В среде SQL Server Management Studio откройте диалоговое окно параметры (Инструменты..Параметры). Детализируйте до «Выполнение запроса / SQL Server / Общие». Вы должны увидеть что-то вроде этого:

введите описание изображения здесь

Настройка времени ожидания выполнения — это то, что вам нужно. Значение 0 указывает бесконечный тайм-аут. Положительное значение — ограничение времени ожидания в секундах.

ПРИМЕЧАНИЕ: это значение «является совокупным временем ожидания для всех сетевых операций чтения во время выполнения команды или обработки результатов. Тайм-аут все еще может произойти после возврата первой строки и не включает время обработки пользователем, только время чтения в сети «. (согласно MSDN).

Если вы используете ADO.Net (System.Data.SqlClient), свойство CommandTimeout объекта SqlCommand — это то, что вам нужно. Глагол тайм-аута строки подключения: Connect Timeout , Connection Timeout или Timeout указывает, как долго ждать при установлении соединения с 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, время ожидания хранимых процедур по умолчанию составляет 30 секунд. При желании вы можете изменить время ожидания на 6 минут, изменив SqlCommand.CommandTimeout

Ответ №4:

В SQL Server я просто щелкаю правой кнопкой мыши по соединению на левой Object Explorer панели, выбираю Activity Monitor , затем Processes щелкаю правой кнопкой мыши по выполняемому запросу и выбираю Kill Process .