Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLBase de datos SQL en Microsoft Fabric
Bloquea la ejecución de un lote, un procedimiento almacenado o una transacción hasta alcanzar la hora o el intervalo de tiempo transcurrido, o hasta que una instrucción especificada modifique o devuelva al menos una fila.
Convenciones de sintaxis de Transact-SQL
Syntax
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Arguments
DELAY
Período de tiempo especificado que debe pasar, hasta un máximo de 24 horas, antes de la ejecución de un lote, procedimiento almacenado o transacciones.
'time_to_pass'
Período de tiempo que se va a esperar.
time_to_pass se pueden especificar en un formato de datos datetime o como una variable local. No se pueden especificar fechas, por lo que no se permite la parte de fecha del valor datetime .
time_to_pass tiene el formato hh:mm[[:ss].fff].
TIME
Hora especificada en la que se ejecuta el lote, el procedimiento almacenado o la transacción.
'time_to_execute'
Hora a la que finaliza la instrucción WAITFOR.
time_to_execute se puede especificar en un formato de datos datetime o se puede especificar como una variable local. No se pueden especificar fechas, por lo que no se permite la parte de fecha del valor datetime .
time_to_execute tiene el formato hh:mm[[:ss].fff] y, opcionalmente, puede incluir la fecha de 1900-01-01.
receive_statement
Se aplica a: solo mensajes de Service Broker. Para obtener más información, consulte RECEIVE.
Una instrucción válida RECEIVE .
get_conversation_group_statement
Se aplica a: solo mensajes de Service Broker. Para obtener más información, vea GET CONVERSATION GROUP.
Una instrucción válida GET CONVERSATION GROUP .
TIEMPO MUERTO
Se aplica a: solo mensajes de Service Broker. Para obtener más información, vea RECEIVE y GET CONVERSATION GROUP.
Especifica el período de tiempo, en milisegundos, que se espera a que llegue un mensaje en la cola.
Remarks
Mientras se ejecuta la WAITFOR instrucción , la transacción se está ejecutando y ninguna otra solicitud se puede ejecutar en la misma transacción.
El retraso de tiempo real puede variar de la hora especificada en time_to_pass, time_to_execute o tiempo de espera, y depende del nivel de actividad del servidor. El contador de tiempo se inicia cuando se programa el subproceso de instrucción WAITFOR . Si el servidor está ocupado, es posible que el subproceso no esté programado inmediatamente, por lo que el retraso de tiempo puede ser mayor que el tiempo especificado.
WAITFOR no cambia la semántica de una consulta. Si una consulta no puede devolver ninguna fila, WAITFOR espere para siempre o hasta TIMEOUT que se alcance, si se especifica.
Los cursores no se pueden abrir en WAITFOR instrucciones .
Las vistas no se pueden definir en WAITFOR instrucciones .
Cuando la consulta supera la opción de espera de consulta, el argumento de instrucción WAITFOR puede completarse sin ejecutarse. Para obtener más información sobre la opción de configuración, consulte Configuración del servidor: espera de consulta. Para ver los procesos activos y en espera, use sp_who.
Cada WAITFOR instrucción tiene un subproceso asociado. Si se especifican muchas WAITFOR instrucciones en el mismo servidor, muchos subprocesos se pueden asociar esperando a que se ejecuten estas instrucciones. SQL Server supervisa el número de subprocesos de WAITFOR instrucciones y selecciona aleatoriamente algunos de estos subprocesos para salir si el servidor comienza a experimentar el colapso del subproceso.
Puede crear un interbloqueo ejecutando una consulta con WAITFOR dentro de una transacción que también contiene bloqueos que impiden los cambios en el conjunto de filas al que accede la WAITFOR instrucción . SQL Server identifica estos escenarios y devuelve un conjunto de resultados vacío si existe la posibilidad de un interbloqueo de este tipo.
Caution
La inclusión WAITFOR ralentiza la finalización del proceso de SQL Server y puede dar lugar a un mensaje de tiempo de espera en la aplicación. Si es necesario, ajuste el valor de tiempo de espera de la conexión en el nivel de aplicación.
Examples
A. Usar WAITFOR TIME
En el ejemplo siguiente se ejecuta el procedimiento sp_update_job almacenado en la msdb base de datos a las 10:20 p.m. (22:20).
EXECUTE sp_add_job @job_name = 'TestJob';
BEGIN
WAITFOR TIME '22:20';
EXECUTE sp_update_job @job_name = 'TestJob',
@new_name = 'UpdatedJob';
END;
GO
B. Uso de WAITFOR DELAY
En el ejemplo siguiente se ejecuta el procedimiento almacenado después de un retardo de dos horas.
BEGIN
WAITFOR DELAY '02:00';
EXECUTE sp_helpdb;
END;
GO
C. Uso de WAITFOR DELAY con una variable local
En el ejemplo siguiente se muestra cómo se puede utilizar una variable local con la opción WAITFOR DELAY. Este procedimiento almacenado espera durante un período de tiempo variable y, después, devuelve información al usuario como el número transcurrido de horas, minutos y segundos.
IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL
DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;
GO
CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss (@DelayLength char(8)= '00:00:00')
AS
DECLARE @ReturnInfo VARCHAR(255)
IF ISDATE('2000-01-01 ' + @DelayLength + '.000') = 0
BEGIN
SELECT @ReturnInfo = 'Invalid time ' + @DelayLength
+ ',hh:mm:ss, submitted.';
-- This PRINT statement is for testing, not use in production.
PRINT @ReturnInfo
RETURN(1)
END
BEGIN
WAITFOR DELAY @DelayLength
SELECT @ReturnInfo = 'A total time of ' + @DelayLength + ',
hh:mm:ss, has elapsed! Your time is up.'
-- This PRINT statement is for testing, not use in production.
PRINT @ReturnInfo;
END;
GO
/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */
EXEC TimeDelay_hh_mm_ss '00:00:10';
GO
Este es el conjunto de resultados.
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.