I SQL Server kan du bruge WAITFOR
erklæring for at forsinke udførelsen af en batch, lagret procedure eller transaktion.
Det virker på samme måde som MySQL's sleep()
fungere.
Faktisk er det nok mere som en kombination af Postgres' tre "sleep"-funktioner:pg_sleep()
, pg_sleep_for()
, og pg_sleep_until()
.
Jeg siger dette, fordi SQL Servers WAITFOR
statement giver dig mulighed for at angive enten en tidsforsinkelse eller en faktisk fast tid, før eksekveringen fortsætter.
Eksempel – Angiv en forsinkelse
For at angive en tidsforsinkelse skal du bruge DELAY
argument, efterfulgt af den faktiske tid til at vente/sove.
Forsinkelsen kan maksimalt være 24 timer.
Her er et eksempel til at demonstrere.
SELECT CURRENT_TIMESTAMP AS [First Timestamp];
WAITFOR DELAY '00:00:10';
SELECT CURRENT_TIMESTAMP AS [Second Timestamp];
Resultat:
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)
Når du bruger DELAY
indstilling, er værdien formateret som tt:mm[[:ss].mss].
Værdien kan angives enten i en datetime dataformat eller som en lokal variabel. Datoer kan dog ikke angives, så datodelen af datetime værdi er ikke tilladt.
Eksempel – Angiv et tidspunkt
Alternativt kan du bruge TIME
argument for at angive et tidspunkt, hvor batchen, den lagrede procedure eller transaktionen kører.
I dette tilfælde er den angivne værdi det tidspunkt, hvor WAITFOR
erklæring afsluttes.
Her er et eksempel til at demonstrere.
SELECT CURRENT_TIMESTAMP AS [First Timestamp];
WAITFOR TIME '04:33:30';
SELECT CURRENT_TIMESTAMP AS [Second Timestamp];
Resultat:
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)
Her er nogle ting, du skal huske på med hensyn til den tidsværdi, du angiver:
- Tidspunktet kan angives i en datotid dataformat, eller det kan angives som en lokal variabel.
- Datoer kan ikke angives, så datodelen af datetime værdi er ikke tilladt.
- Tidspunktet er formateret som tt:mm[[:ss].mss] og kan eventuelt inkludere datoen 1900-01-01.
Den faktiske forsinkelse kan variere
Den faktiske tidsforsinkelse kan variere fra det tidspunkt, du angiver, da dette vil afhænge af ting såsom serverbelastning.
Tidstælleren starter, når WAITFOR
erklæringstråd er planlagt. Hvis serveren er optaget, planlægges tråden muligvis ikke med det samme, så tidsforsinkelsen kan være længere end den angivne tid.
Server Broker Beskeder
WAITFOR
sætningen accepterer nogle argumenter/værdier, der kun gælder for Service Broker-meddelelser.
Når du bruger Service Broker-meddelelser, kan du angive en RECEIVE
sætning eller en GET CONVERSATION GROUP
sætning, samt en TIMEOUT
argument, der angiver tidsperioden, i millisekunder, der skal vente på, at en besked ankommer i køen.
Se Microsofts officielle dokumentation for mere information om disse muligheder.