Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Equivalente do SQL Server a Sleep():A Instrução WAITFOR


No SQL Server, você pode usar o WAITFOR instrução para atrasar a execução de um lote, procedimento armazenado ou transação.

Funciona de forma semelhante ao sleep() do MySQL função.

Na verdade, provavelmente é mais como uma combinação das três funções “sleep” do Postgres:pg_sleep() , pg_sleep_for() e pg_sleep_until() .

Digo isso porque o WAITFOR do SQL Server A instrução oferece a opção de especificar um atraso de tempo ou um tempo fixo real antes que a execução continue.

Exemplo – Especificar um atraso


Para especificar um atraso de tempo, use o DELAY argumento, seguido pelo tempo real para esperar/dormir.

O atraso pode ser de no máximo 24 horas.

Aqui está um exemplo para demonstrar.
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)

Ao usar o DELAY opção, o valor é formatado como hh:mm[[:ss].mss].

O valor pode ser especificado em um datetime formato de dados ou como uma variável local. No entanto, as datas não podem ser especificadas, portanto, a data faz parte do datetime valor não é permitido.

Exemplo - Especificar um horário


Alternativamente, você pode usar o TIME argumento para especificar uma hora em que o lote, procedimento armazenado ou transação é executado.

Neste caso, o valor fornecido é a hora em que o WAITFOR declaração termina.

Aqui está um exemplo para demonstrar.
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)

Aqui estão algumas coisas a serem lembradas em relação ao valor de tempo que você fornece:
  • A hora pode ser especificada em um datetime formato de dados, ou pode ser especificado como uma variável local.
  • As datas não podem ser especificadas, então a data faz parte do datetime valor não é permitido.
  • A hora é formatada como hh:mm[[:ss].mss] e pode incluir opcionalmente a data de 1900-01-01.

O atraso real pode variar


O atraso de tempo real pode variar do horário especificado, pois isso dependerá de coisas como a carga do servidor.

O contador de tempo inicia quando o WAITFOR thread de instrução está agendado. Se o servidor estiver ocupado, o encadeamento pode não ser agendado imediatamente, portanto, o atraso pode ser maior que o tempo especificado.

Mensagens do agente do servidor


O WAITFOR A instrução aceita alguns argumentos/valores que são aplicáveis ​​apenas a mensagens do Service Broker.

Ao usar mensagens do Service Broker, você pode fornecer um RECEIVE instrução ou um GET CONVERSATION GROUP instrução, bem como um TIMEOUT argumento que especifica o período de tempo, em milissegundos, para aguardar a chegada de uma mensagem na fila.

Consulte a documentação oficial da Microsoft para obter mais informações sobre essas opções.