Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Blokuje wykonywanie partii, procedury składowanej lub transakcji, dopóki nie upłynął określony czas lub interwał czasu albo określona instrukcja modyfikuje lub zwraca co najmniej jeden wiersz.
Transact-SQL konwencje składni
Syntax
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Arguments
ZWŁOKA
Określony okres, który musi upłynąć do maksymalnie 24 godzin, przed wykonaniem partii, procedury składowanej lub transakcji.
'time_to_pass'
Czas oczekiwania.
time_to_pass można określić w formacie danych daty/godziny lub jako zmienną lokalną. Nie można określić dat, więc część daty wartości daty/godziny nie jest dozwolona.
time_to_pass jest sformatowany jako hh:mm[[:ss].fff].
TIME
Określony czas uruchomienia partii, procedury składowanej lub transakcji.
'time_to_execute'
Godzina zakończenia instrukcji WAITFOR.
time_to_execute można określić w formacie danych daty/godziny lub można go określić jako zmienną lokalną. Nie można określić dat, więc część daty wartości daty/godziny nie jest dozwolona.
time_to_execute jest sformatowany jako hh:mm[[:ss].fff] i opcjonalnie może zawierać datę .1900-01-01
receive_statement
Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz RECEIVE.
Prawidłowa RECEIVE instrukcja.
get_conversation_group_statement
Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz GET CONVERSATION GROUP (POBIERZ GRUPĘ KONWERSACJI).
Prawidłowa GET CONVERSATION GROUP instrukcja.
TIMEOUT
Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz RECEIVE and GET CONVERSATION GROUP ( ODBIERANIE i POBIERANIE GRUPY KONWERSACJI).
Określa okres czasu (w milisekundach) oczekiwania na nadejście komunikatu do kolejki.
Remarks
WAITFOR Podczas wykonywania instrukcji transakcja jest uruchomiona i żadne inne żądania nie mogą być uruchamiane w ramach tej samej transakcji.
Rzeczywiste opóźnienie czasu może się różnić od czasu określonego w time_to_pass, time_to_execute lub przekroczeniu limitu czasu i zależy od poziomu działania serwera. Licznik czasu rozpoczyna się po zaplanowaniu wątku WAITFOR instrukcji. Jeśli serwer jest zajęty, wątek może nie być natychmiast zaplanowany, więc opóźnienie czasu może być dłuższe niż określony czas.
WAITFOR nie zmienia semantyki zapytania. Jeśli zapytanie nie może zwrócić żadnych wierszy, WAITFOR czeka na zawsze lub do momentu TIMEOUT osiągnięcia, jeśli zostanie określony.
Nie można otwierać kursorów na WAITFOR instrukcjach.
Widoków nie można zdefiniować w instrukcjach WAITFOR .
Gdy zapytanie przekroczy opcję oczekiwania zapytania, WAITFOR argument instrukcji może zakończyć się bez uruchamiania. Aby uzyskać więcej informacji na temat opcji konfiguracji, zobacz Konfiguracja serwera: oczekiwanie na zapytanie. Aby wyświetlić aktywne i oczekujące procesy, użyj sp_who.
Każda WAITFOR instrukcja ma skojarzony wątek. Jeśli na tym samym serwerze określono wiele WAITFOR instrukcji, wiele wątków można powiązać czekając na uruchomienie tych instrukcji. Program SQL Server monitoruje liczbę WAITFOR wątków instrukcji i losowo wybiera niektóre z tych wątków, aby zakończyć działanie, jeśli serwer zacznie doświadczać głodu wątku.
Zakleszczenie można utworzyć, uruchamiając zapytanie w WAITFOR ramach transakcji, która zawiera również blokady uniemożliwiające wprowadzenie zmian w zestawie wierszy, do którego uzyskuje dostęp instrukcja WAITFOR . Program SQL Server identyfikuje te scenariusze i zwraca pusty zestaw wyników, jeśli istnieje prawdopodobieństwo takiego zakleszczenia.
Caution
Uwzględnianie WAITFOR spowalnia ukończenie procesu programu SQL Server i może spowodować przekroczenie limitu czasu w aplikacji. W razie potrzeby dostosuj ustawienie limitu czasu dla połączenia na poziomie aplikacji.
Examples
A. Użyj FUNKCJI WAITFOR TIME
Poniższy przykład wykonuje procedurę sp_update_job składowaną w msdb bazie danych o godzinie 10:20 (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. Użyj FUNKCJI WAITFOR DELAY
Poniższy przykład wykonuje procedurę składowaną po dwugodzinnym opóźnieniu.
BEGIN
WAITFOR DELAY '02:00';
EXECUTE sp_helpdb;
END;
GO
C. Używanie funkcji WAITFOR DELAY z zmienną lokalną
W poniższym przykładzie pokazano, jak można użyć zmiennej lokalnej z opcją WAITFOR DELAY . Ta procedura składowana czeka na zmienny okres czasu, a następnie zwraca informacje do użytkownika jako liczbę upłynięcia godzin, minut i sekund.
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
Oto zestaw wyników.
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.