#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
.