I SQL Server kan du använda WAITFOR
uttalande för att fördröja exekveringen av en batch, lagrad procedur eller transaktion.
Det fungerar på samma sätt som MySQL:s sleep()
fungera.
Egentligen är det förmodligen mer som en kombination av Postgres tre "sleep"-funktioner:pg_sleep()
, pg_sleep_for()
och pg_sleep_until()
.
Jag säger detta eftersom SQL Servers WAITFOR
uttalande ger dig möjlighet att ange antingen en tidsfördröjning eller en faktisk fast tid innan exekveringen fortsätter.
Exempel – Ange en fördröjning
För att ange en tidsfördröjning, använd DELAY
argument, följt av den faktiska tiden att vänta/sova.
Fördröjningen kan vara max 24 timmar.
Här är ett exempel att visa.
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 använder DELAY
alternativet formateras värdet som hh:mm[[:ss].mss].
Värdet kan anges antingen i en datetime dataformat eller som en lokal variabel. Datum kan dock inte anges, så datumdelen av datetime värde är inte tillåtet.
Exempel – Ange en tid
Alternativt kan du använda TIME
argument för att ange en tidpunkt då batchen, den lagrade proceduren eller transaktionen körs.
I det här fallet är det angivna värdet den tidpunkt då WAITFOR
uttalandet avslutas.
Här är ett exempel att visa.
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)
Här är några saker att tänka på när det gäller tidsvärdet som du anger:
- Klockan kan anges i en datetime dataformat, eller så kan det anges som en lokal variabel.
- Datum kan inte anges, så datumdelen av datetime värde är inte tillåtet.
- Klockan är formaterad som hh:mm[[:ss].mss] och kan valfritt inkludera datumet 1900-01-01.
Den faktiska fördröjningen kan variera
Den faktiska tidsfördröjningen kan variera från den tid du anger, eftersom detta beror på saker som serverbelastning.
Tidsräknaren startar när WAITFOR
uttalandetråden är schemalagd. Om servern är upptagen kanske tråden inte schemaläggs omedelbart, så tidsfördröjningen kan vara längre än den angivna tiden.
Meddelanden från servermäklare
WAITFOR
uttalandet accepterar vissa argument/värden som endast är tillämpliga på Service Broker-meddelanden.
När du använder Service Broker-meddelanden kan du ange en RECEIVE
uttalande eller en GET CONVERSATION GROUP
uttalande, samt en TIMEOUT
argument som anger tidsperioden, i millisekunder, för att vänta på att ett meddelande kommer till kön.
Se Microsofts officiella dokumentation för mer information om dessa alternativ.