sql >> Base de Datos >  >> RDS >> Sqlserver

Equivalente de SQL Server a Sleep():la instrucción WAITFOR

En SQL Server, puede usar WAITFOR instrucción para retrasar la ejecución de un lote, procedimiento almacenado o transacción.

Funciona de forma similar a sleep() de MySQL. función.

En realidad, probablemente sea más como una combinación de las tres funciones de "reposo" de Postgres:pg_sleep() , pg_sleep_for() y pg_sleep_until() .

Digo esto porque WAITFOR de SQL Server le da la opción de especificar un retraso de tiempo o un tiempo fijo real antes de que continúe la ejecución.

Ejemplo:especificar un retraso

Para especificar un retraso de tiempo, use el DELAY argumento, seguido del tiempo real de espera/dormir.

El retraso puede ser de un máximo de 24 horas.

Aquí hay un ejemplo para demostrarlo.

SELECT CURRENT_TIMESTAMP AS [First Timestamp];
WAITFOR DELAY '00:00:10';
SELECT CURRENT_TIMESTAMP AS [Second Timestamp];

Resultado:

Time: 11.137s (11 seconds)
+-------------------------+
| First Timestamp         |
|-------------------------|
| 2020-06-29 00:02:30.963 |
+-------------------------+
(1 row affected)
Commands completed successfully.
+-------------------------+
| Second Timestamp        |
|-------------------------|
| 2020-06-29 00:02:41.610 |
+-------------------------+
(1 row affected)

Cuando se usa el DELAY opción, el valor tiene el formato hh:mm[[:ss].mss].

El valor se puede especificar en una fecha y hora formato de datos, o como una variable local. Sin embargo, las fechas no se pueden especificar, por lo que la fecha forma parte de datetime valor no está permitido.

Ejemplo:especificar una hora

Alternativamente, puede usar el TIME argumento para especificar una hora en la que se ejecuta el lote, el procedimiento almacenado o la transacción.

En este caso, el valor proporcionado es el momento en que WAITFOR finaliza la declaración.

Aquí hay un ejemplo para demostrarlo.

SELECT CURRENT_TIMESTAMP AS [First Timestamp];
WAITFOR TIME '04:33:30';
SELECT CURRENT_TIMESTAMP AS [Second Timestamp];

Resultado:

Time: 39.487s (39 seconds)
+-------------------------+
| First Timestamp |
|-------------------------|
| 2020-06-29 04:32:51.183 |
+-------------------------+
(1 row affected)
Commands completed successfully.
+-------------------------+
| Second Timestamp |
|-------------------------|
| 2020-06-29 04:33:30.160 |
+-------------------------+
(1 row affected)

Aquí hay algunas cosas que debe tener en cuenta con respecto al valor de tiempo que proporciona:

  • La hora se puede especificar en un datetime formato de datos, o se puede especificar como una variable local.
  • Las fechas no se pueden especificar, por lo que la fecha forma parte de datetime el valor no está permitido.
  • La hora tiene el formato hh:mm[[:ss].mss] y, opcionalmente, puede incluir la fecha 1900-01-01.

El retraso real puede variar

El retraso de tiempo real puede variar del tiempo que especifique, ya que esto dependerá de cosas como la carga del servidor.

El contador de tiempo comienza cuando WAITFOR hilo de declaración está programado. Si el servidor está ocupado, es posible que el hilo no se programe de inmediato, por lo que el tiempo de demora puede ser mayor que el tiempo especificado.

Mensajes del agente del servidor

El WAITFOR La declaración acepta algunos argumentos/valores que se aplican solo a los mensajes de Service Broker.

Al usar los mensajes de Service Broker, puede proporcionar un RECEIVE declaración o un GET CONVERSATION GROUP declaración, así como un TIMEOUT argumento que especifica el período de tiempo, en milisegundos, para esperar a que llegue un mensaje a la cola.

Consulte la documentación oficial de Microsoft para obtener más información sobre estas opciones.